从文本处理到脚本编辑

文本处理工具
grep 文本搜索工具,根据用户指定的“模式” 对目标文本逐行进行匹配检查,打印匹配到的行.
-o 仅显示匹配到的字符串
-v 显示不被模式匹配到的行
-n 显示匹配的行数
-c 统计匹配的行数
-i 忽略字符大小写
-q 静默模式,不输出任何信息
-A# 后#行
-B# 前#行
-C# 前后各#行
-e 实现多个选项间的逻辑or关系 grep -e ‘cat’ -e ‘dog’
-w 匹配整个单词
-E 使用ERE
-F 相当于fgrep,不支持正则表达式
正则表达式: 由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能.
两类: 基本正则表达式 ; 扩展正则表达式 (grep -e ; egrep)
元字符分类: 字符匹配,匹配次数,位置锚定,分组

基本正则表达式元字符:
\. 转义 “.\..” \. 就是.的意思
. 任意的单个字符 (在括号里就是 .)
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符

匹配次数: 用在要指定次数字符后面,指定前面字符要出现的次数
.* 任意长度的任意字符
* 匹配前面字符任意次 包括0次
\? 匹配前面字符的0或1次
\+ 匹配前面字符1次或n次
\{n\} 匹配前面字符n次
\{n,\}匹配前面字符最少n次
\{,n\}匹配前面字符最多n次
\{m,n\} 匹配前面字符出现m-n次

如: grep “go\{10\}gle” / o出现十次
go\?gle
“[a-z]\+” a-z 任意一个出现一次或多次

{1,5\} 1-5 个字符
位置锚定: 定位出现的位置
^ 行首锚定,用于模式的行首 “^zhang”
$ 行尾锚定,用于模式的行尾 “zhang$”
^pattren$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行 (空格 Tab)
\<或\b 词首锚定,用于单词模式的行首 \>或\b 词尾锚定,用于单词模式的行尾
\<pattern\> 匹配整个单词

分组 : \(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理.
如: \(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3…
\1 表示从行首起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
如: \(zhang1\+\(zhang2\)*\) \1 : zhang1\+\(zhang2\)* \2 : zhang2
后向引用:引用前面的分括号中的模式所匹配字符,而非模式本身
或者:\| a\|b a或b \(C\|c\)at Cat或cat
egrep及扩展正则表达式
egrep = grep -E
字符匹配:
. 任意单个字符
.* 任意长度的任意字符
[] 指定范围的字符
[^] 不在指定范围的字符
* 匹配前面的字符任意次
? 0或1次(最多一次)
+ 1次或多次(最少一次)
\{m} 匹配m次
\{m,n} 匹配m-n次
位置锚定:
^ :行首 $ :行尾 \<, \b :语首 \>, \b :语尾 
分组:
() 后向引用:\1, \2, … 
或者:
‘a|b’: a或b ‘C|cat’: C或cat ‘(C|c)at’:Cat或cat

0-9[0-9] 10-99[1-9][0-9] 100-199=1[0-9][0-9] 200-249=2[0-4][0-9] 250-255=25[0-5]

vim 文本编辑器
行编辑器 sed 全屏编辑器 nano vim

三种主要模式:
命令(Normal)模式: 默认模式,移动光标,剪切/粘贴文本
插入(Insert)或编辑模式: 修改文本 
扩展命令(extended command )模式: 保存,退出等
i–编辑模式
:–扩展模式
v–编辑模式
Esc 退出当前模式, 总是返回到命令模式

vim +/ 打开文件
-b 二进制方式打开文件
-d 比较多个文件
-m 只读打开文件
-e 直接进入ex模式
命令模式:
i 在光标处输入
I 在当前光标行首输入
x 删除光标处的字符
~ 转化大小写
r 替换光标所在处的字符
dd 删除整行
y 复制
Y 复制整行
p 粘贴
扩展模式:
:q 退出
:q! 强制退出不做修改
:wq 保存退出 / / 保存到新建文件下
😡 保存退出

 

 

 

Shell 脚本编程基础
程序:指令+数据
程序编程风格: 过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据

格式要求:首行shebang机制: #/bin/bash

创建shell脚本
1.使用文本编辑器创建文本文件
第一行必须有shell声明序列:
#/bin/bash
添加注释: 以#开头
2.运行脚本
给予执行权限,在命令行上指定脚本的绝对或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行

(.)source 使脚本是在当前shell进行
. /etc/profile.d/env.sh 改完文本文件脚本用 . 可立即生效

bash -x /.sh 显示脚本过程
bash -n /.sh 检测脚本错误语法

变量:变量命名法则:不能使程序中的保留字:如if,for
只能使用数字,字母下划线,且不能以数字开头。
见名知义。
统一命名规则:驼峰命名法

bash中的变量种类:
局部变量:生效范围为当前shell进程;对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效。
环境(全局)变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片段,通常指函数
位置变量:$1,$2,……来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:$?,$0,$*,$@,$#,$$

局部变量: 变量赋值:name= ‘VALUE’ (值)
可以使用引用VALUE:
1,可以是直接字符串;name= “root”
2,变量引用:name= “$USER”
3,命令引用:name=Command name=$(Command)
变量引用:${name} $name
“”:弱引用,其中的变量引用会被替换为变量值
”:强引用,其中的变量引用不会被替换为变量值,而保持元字符串
显示已定义的所有变量:set
删除变量:unset name

全局变量:
变量声明,赋值:
export name=VALUE
declare -x name=VALUE
变量引用:$name,${name}
显示所有环境变量: env printenv export declare -x
删除变量: unset name
bash内建的环境变量:PATH SHELL USER UID HOME PWD SHLVL LANG MAIL HOSTNAME HISTSIZE –

只读变量:只能声明,但不能修改和删除
声明只读变量:readonly name declare -r name
查看只读变量:readonly -p

位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, …:对应第1、第2等参数,shift [n]换位置
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $* 只在被双引号包起来的时候才会有差异
set– 清空所有位置变量
bash退出状态 0成功 1-255失败
脚本中一但遇到 exit 脚本会立即终止;终止退出状态取决于exit后面的数字。

bash中的算术运算:let + – * % /
增强型赋值:+= -= *= %= /=
a=$1
b=$2
let c=a+b
echo $c

bash有内建的随机数生成器:$RANDOM(0-32767) echo $[$RANDOM%50] :0-49之间随机数

bash的数值测试
 -v VAR 变量VAR是否设置 
数值测试: -gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于

添加变量: name=”zhang” 显示变量: echo $name
name=hostname 显示变量: echo $name
name=/date/wenjian 显示变量 :echo $”name”
i=100 :echo $i
zhang=abcc :echo $zhang
unset name 删除变量

(name=zhang;echo $name)加()表示一次性,不改变变量
不影响当下得shell环境
{ name=zhang;echo $name } 加{}改变变量,同时执行

export name 把name改变成全局变量

编辑脚本。

#!/bin/bash
#
#*******************************************************
#Author: chongyang.zhang
#QQ: 285930443
#Date: 2018-04-09
#FileName: 91_scp.sh
#URL: http://www.magedu.com
#Description: The test script
#Copyright (C): 2018 All rights reserved
#*******************************************************
#
echo “Start copy…”
scp $* wang@172.20.102.77:/home/wang/bin
echo “Copy finished”

脚本内容:复制91_scp.sh文件,到ip172.20.102.77的/home/wang/bin下得目录

#: ./91_scp.sh 91_scp.sh
(执行91_scp.sh程序,复制91_scp.sh文件)
scp 远程复制
scp 文件 用户名@IP:目录
scp /data/z root@172.20.109.27:/data/

COLOR=$[RANDOM%7+31] ; echo -e “\e[1;${COLOR}mcolor\e[0m”
echo $COLOR(输入变量) color随机变色

脚本中添加颜色:
echo -e “\e[1;31m变量\e[0m”

例:[ $c -le 1000 ] && echo -e “\e[1;33mhaha\e[0m” || echo -e “\e[1;34mxixi\e[0m”

逻辑运算:
& 并且 and | 或者 or
cmd1 && cmd2 如果cmd1为假,cmd2不执行;反之cmd1为真,cmd2执行。
cmd1 || cmd2 如果cmd1为假,cmd2执行;反之cmd1为真,cmd2不执行。

cmd1 && echo aaa || echo bbb cmd1为真,显示aaa
cmd1为假,显示bbb

磁盘空间超过80报警脚本:

DF=df | |tr -s ' '|tr ' ' '%'|cut -d'%' -f5|sort -n|tail -n1

[ $DF -ge 80 ] && wall "disk will be full" || wall "perfect"
(DF超过80,显示disk…… ;不超,显示perfect)

脚本中显示用 wall "perfect……"
(wall用于向系统当前所有打开终端上输出信息,显示时间。。)

用echo可以显示,不需要 ` “”

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96963

发表评论

登录后才能评论

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班