一、正则表达式
什么是正则?正则就是一串由规律的字符串,在shell中用处很大,常用的指令有grep/egrep,sed,awk。
grep更适合单纯的查找或者匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行复杂格式处理。
1
grep通常配合管道符一起使用:grep -参数 ‘word’ filename |
|
-c |
统计行数 |
-i |
不区分大小写 |
-n |
显示行号 |
-v |
取反 |
-r |
遍历所有子目录 |
-A |
加数字过滤出符合要求的行以及下面n行 |
-B |
同上,过滤出符合条件的行以及上面n行 |
-C |
同上,过滤出符合条件的行以及上下n行 |
-E |
显示符合多个条件的记录 |
2、
engrep进阶版 |
|
grep ‘[0-9]’ passwd |
显示包含数字的行 |
grep -v ‘[0-9]’ passwd |
显示不包含数字的行 |
grep -v ‘^#’ passwd |
显示不以#开头的行 |
grep -v ‘^#’ passwd|grep -v ‘^@’ |
显示既不以#也不以@开头的行 |
grep ‘^[^a-zA-Z]’ passwd |
显示不包含字母并且不是以字母开头的行,第一个^表示以什么开头,第二个^表示取反 |
grep ‘r.o’ passwd |
查询r o中间包含一个字符的行 |
grep ‘o*’ passwd |
查询含有任意个o的行 |
grep ‘o\{2\}’ passwd/grep -E ‘o{2} |
查询含有两个连续o的行 |
egrep ‘o{2}’ passwd |
查询含有两个连续o的行 |
egrep ‘o+’ passwd |
查询含有o的行 |
egrep ‘oo?’ passwd |
查询含有o的行 |
egrep ‘root|nologin’ passwd |
查询含有root或者nologin的行 |
egrep ‘(oo){2}’ passwd |
重复出现两次oo组合的字符串 |
grep ‘o\{2\}’ passwd 中\为转义符,因为{}是特殊字符所以要转义
也可以使用grep -E ‘o{2}’ passwd来显示
如果不加转义符,结果显示为
3、
sed是一种流编辑器,可以实现行的输出替换删除等操作 |
|
n |
只打印模式匹配的行 |
e |
可以同时打印多行,为默认选项 |
f |
将sed操作写在另一个文件内 |
i |
直接修改文件内容 |
n\? |
匹配n零或一次 |
\{m,n\} |
匹配前面字符至少m此至多n次 |
\{m\} |
精确匹配前面字符m次 |
[ ] |
匹配[ ]内任意单个字符 |
[^] |
匹配除[ ]内任意单个字符 |
r |
可以省去很多转义操作 |
sed -n ‘5’p passwd |
打印出第五行 |
sed -n ‘1,5’ passwd |
打印1-5行 |
sed -n ‘1,$’p passwd |
打印所有 |
sed -n ‘/root/’p passwd |
打印包含root的行 |
sed -n ‘/^1/’p passwd |
打印以1开头的行 |
sed -n ‘/r..o/’p passwd |
打印r和o中间有两个字符的行 |
sed -n ‘/oo*/’p passwd |
打印含有o的行 |
sed -e ‘1’p -e ‘/111/’p -n passwd |
打印第一行和包含111的行 |
sed ‘1’d passwd |
打印不显示第一行 |
sed ‘/oot/’d passwd |
打印不包含oot的行 |
sed ‘1,2s/ot/to/g’ passwd |
将1-2行所有ot替换为to |
sed ‘s#ot#to#g’ passwd |
将所有的ot替换为to |
sed ‘s/[0-9]/%/g’ passwd |
将所有数字替换成% |
sed ‘s/[a-zA-Z]/%/g’ passwd |
将所有字母替换成% |
sed -r ‘s/(root)(.*)(nologin)/\3\2\1/’ |
见下图*1 |
sed ‘s/^.*$/123&/’ passwd |
将123添加到每行行首 |
sed -i ‘s/ot/to/g’ passwd |
将所有ot替换为to |
*1
4、
awk是一种文本处理语言 |
|
-F |
指定输入文件分隔符 |
-v |
赋予一个用户定义的变量 |
~ |
匹配,与==相比不是精确比较 |
ARGC |
命令行变元个数 |
ARGV |
命令行变元数组 |
FILENAME |
当前输入文件名 |
FNR |
与NR类似,每个文件从1开始 |
FS |
输入域分隔符,默认为一个空格 |
RS |
输入记录分隔符 |
NF |
有几个域即分隔符分开几个字段 |
$NF |
最后一个列 |
OFS |
输出分割符 |
ORS |
输出记录分隔符 |
head -n2 passwd|awk -F ‘:’ {print $1}’ |
显示文本前两行的第一列 |
head -n2 passwd|awk -F ‘:’ {print $0}’ |
显示前两行 |
awk -F ‘:’ ‘{print $1”#”$2”#”$3” #”$4}’ |
显示前四列并以#分隔开 |
awk ‘/oo/’ passwd |
显示带有oo的行 |
awk -F ‘:’ ‘$1 ~/oo/’ passwd |
显示第一列带有oo的行 |
awk -F ‘:’ ‘$3==”0”’ passwd |
|
awk -F ‘:’ ‘$3>=500’ passwd |
显示第三列大于500的行 |
awk -F ‘:’ ‘$7!=/sbin/nologin”’ |
显示第七列不是该目录的行 |
awk -F ‘:’ ‘$3<$4’ passwd |
显示第三列小于第四列的行 |
head -5 passwd |awk -F ‘:’ ‘{OFS =”#”} {print $1,$3,$4}’ |
OFS为输出分隔符,显示前五行,1,3,4列并以#隔开 |
head -n3 passwd |awk -F ‘:’ ‘{pri nt NF}’ |
输出当前记录域的个数 |
head -n3 passwd |awk -F ‘:’ ‘{printNR}’ |
输出读取前三行的行数 |
awk ‘NR>3’ passwd |
显示读取数据行数大于三的行 |
awk -F ‘:’ ‘NR<20&&$1 ~/roo/’ |
表示前二十行并第一列带有roo行 |
awk -F ‘:’ ‘{(tot=tot+$3)}; END {print tot}’ passwd |
统计第三列文件长度相加值 |
awk -F ‘:’ ‘{if($1==”root”)print $0}}’ passwd |
如果第一列值为root,则输出整行 |
5、正则中需要转义的字符
$,(),*,+,{},[],^,.,|
正则三侠具体怎么发挥作用还需要大量的手动练习,如果本文有什么错误欢迎指出,一起讨论~