一、正则表达式
它是一种文本模式匹配(a到z之间字母和特殊字符---元字符);
它是一种字符串匹配的模式,可以检查一个字符串是否含有某种子串、把要匹配的子串替换 或者 是从某个字符串中
提取某个条件的子串;
它就像一个数学公式一样,我们通过它来生成一个公式从海量的数据中匹配出需要的数据;
常见的命令有 grep、sed、awk。
新建个测试数据 vim file
ac
ab
abbc
abcc
aabbc
cabbbc
acc
abc
asb
aa
bb
a_c
aZc
aAAAAc
a c
ABC
ccc
dddd
http://www
abababab
c c d
123
a3c
e*f
特殊字符
1. 定位符 使用技巧:同时指定开头和结尾,是精确匹配;单一指定开头和结尾,是模糊匹配
^ 指定开头^a 默认指定一个字符
$ 指定结尾a$ 默认指定一个字符
知识点
egrep 和 grep -E 这两个表达的一样的作用 是增强版的grep
egrep "^ac$" file 这是精确匹配上面我们新建的文件内容
2. 字符串:匹配字符串
. 匹配任意一个字符
() 字符串分组
[] 定义字符类,匹配中括号里的一个字符,
[^] 在里面 加 ^ 就是取反
\ 转义字符 例如匹配 a开头 中间* 结尾c的 就可以使用这个转义字符 格式 egrep "^a\*c$" file
| 管道命令 分组 或者关系
3.限定符
* 代表某个字符不出现或者出现多次 egrep "^ab*c$" file
? 和*有点类似,但是代表该字符出现一次或者不出现
+ 表示前面字符出现一次或者多次,但必须出现一次
{}n,m} 某个字符之后出现,表示该字符最少n次,最多m次
{m} 正好出现m次
4.POSIX特殊字符
[:alpha:] 英文大小写字符,亦A-Z a-z
[:alnum:] 英文大小写字符以及数字:亦A-Z a-z 0-9
[:blank:] 空格键与tab键
[:cntrl:] 键盘的控制按键
[:digit:] 数字,亦0-9
[:graph:] 除去空格符(空格键和tab键)外的其ls它所有符号
[:lower:] 代表小写字符,亦:a-z
[:print:] 任何可以被打印出来的字符
[:punct:] 标点符号
[:upper:] 大写字符,亦:A-Z
[:space:] 空白符
[:xdigit:] 16进位的数字类型,0-9,A-F,a-f的数字与字符
例1 匹配合法ip
egrep '^((25[0-5] | 2[0-4][[:digit:]] | [01]?[[:digit:]][[:digit:]]?).){3} (25[0-5] | 2[0-4][[:digit:]] | [01]?[[:digit:]][[:digit::]]?)$' --color ip.txt
分析 (25[0-5] ip取值250-255
2[0-4][[:digit:]] 取值200-249
[01]?[[:digit:]][[:digit:]]?.) 取值0到99
.) {3} 接着这个代表ip地址的 x . x . x. 出现三次
(25[0-5] | 2[0-4][[:digit:]] | [01]?[[:digit:]][[:digit::]]?)$' 这是最后一段的ip 没有 . 结尾
例2 匹配座机号码
egrep "^[[:graph:]]{12}$" "[1-9}[0-9][0-9]?-[1-9][0-9]{6,7}$"
sed命令
语法
sed [options] '{command}[flags]' [filename]
命令选项
-e script 将脚本中指定的命令添加到处理输入时执行的命令中 多条件,一行中要有多个操作
-f script 将文件中指定的命令添加到处理输入时执行的命令中
-n 抑制自动输出
-i 编辑文件内容
-i.bak 修改时同时创建.bak备份文件
-r 使用扩展的正则表达式
! 取反 (跟着模式条件后与shell有所区别)
sed常用内部命令
a 在匹配后添加
i 在匹配前添加
p 打印
d 删除
s 查找替换
c 更改
y 转换 N D P
flags
数字 表示文本替换的模式
g: 表示用新文本替换现有文本的全部实例
p: 表示打印原始内容
w filename: 将替换的结果写入文本
$= 统计文本有多少行 (小技巧)
sed -n ‘¥=’ filename
脚本演示 : shell解决DNS负载均衡RS的健康检测
#! /bin/bash
caipan1=0
caipan2=0 #定义两个裁判变量记录状态
while true;do
ping -c1 192.168.1.1 &> /dev/null
state=$?
if ! [ state -eq 0 ] && [ $caipan1 -eq 0 ];then
sed -i '/192.168.1.1/s/^/;/' dns
/etc/init.d/bind restart
caipan1=1
elif [ state -eq 0 ] && [ $caipan1 -eq 1 ];then
sed -i '/192.168.1.1/s/;//' dns
/etc/init.d/bind restart
caipan1=0
fi
ping -c1 192.168.1.2 &> /dev/null
state=$?
if ! [ state -eq 0 ] && [ $caipan2 -eq 0 ];then
sed -i '/192.168.1.2/s/^/;/' dns
/etc/init.d/bind restart
caipan2=1
elif [ state -eq 0 ] && [ $caipan2 -eq 1 ];then
sed -i '/192.168.1.2/s/;//' dns
/etc/init.d/bind restart
caipan2=0
fi
sleep 5 #休息5秒,继续工作。
done
awk语句对输出流的处理
1. awk介绍
awk可以实现数据的处理、运算、输出,它认为每一行的数据视为一条记录,每一列视为字段
(aaaa\nbbb\n视为行,aaaa bbb ccc视为列)
awk语法
awk [options] [BEGIN]{program}[END]{file}
常用命令选项
-F fs 指定描绘一行中数据字段的文件分隔符 默认是空格
-f file 指定读取程序的文件名
-v var=value 定义awk程序中使用的变量和默认值
注意:awk程序脚本由左大括号和右大括号定义,脚本命令必须放置在两个大括号之间,
由于awk命令行假定脚本是单文本字段括在单引号内。
awk程序运行的优先级是:
1)BEGIN: 在开始处理数据流之前执行,可选项(要打印字符串一定要加上BEGIN,
不然就执行program了。)
2)program: 如何处理数据流,必选项 (要有数据流才会执行,不然就一动不动了)
3)END: 处理完数据流后执行,可选选
2. awk对字段(列)的提取
字段相关内置变量
$0 表示整行文本
$1 表示文字中的第一个数据字段
$2 表示文字中的第二个数据字段
$N 表示文字中的第N个数据字段
$NF 表示文字中的最后一个个数据字段
例 命令格式 awk '{print $0}' filenam
3. awk对记录(行)的提取
NR: 指定行号
例 awk ‘NR==3(print $0)’ filenam 指定提取第三行。