目录
- 正则简介
- 正则三剑客一:grep
- 正则三剑客二:sed
- 正则三剑客三:awk
1. 正则简介
什么是正则表达式?
简单的说,正则表达式就是为处理大量的字符串而定义的一套规则和方法
通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理。
掌握好正则对于编写shell脚本有很大帮助
各种编程语言中都有正则,原理是一样的
linux的正则表达式,最常应用正则表达式的命令就是grep、egrpe、sed、awk,换句话说linux三剑客要想能工作的更高效,那一定离不开正则表达式的配合。
正则表达式和我常用的通配符特殊字符是有本质区别的。
2.正则三剑客一:grep
grep的功能主要用于过滤指定关键词。
命令:grep
参数:
-c
:行数
-i
:不区分大小写
-n
:显示行号
-v
:取反
-r
:遍历所有子目录
-A
:后面跟数字,过滤出符合要求的行以及下面n行
-B
:同上,过滤出符合要求的行以及上面n行
-C
:同上,同时过滤出符合要求的行以及上下各n行
例子:
grep -n 'root' /etc/passwd
:列出/etc/passwd内容里带有root的行,并标注处所在的行是文件内的第几行
grep -nv 'nologin' /etc/passwd
:列出/etc/passwd内容里不带有‘nologin’的行,并标注处所在的行是文件内的第几行
grep '[0-9]'/etc/inittab
:列出/etc/inittable内容里带有数字的行
grep -v '[0-9]'/etc/inittab
:列出/etc/inittable内容里不带有数字的行
grep -v '^#' /etc/inittab
:列出/etc/inittable内容里不是以“#”开头的行,因为没有,且小郭为了证实,在命令后面加了管道验证
grep -v '^#' /etc/inittab|grep -v '^$'
:列出/etc/inittable内容里不是以“#”开头且不是以"$"开头的行,因为没有,小郭为了证实,在命令后面加了管道验证
grep '^[^a-zA-Z]' test.txt
:列出test.txt内容里不是以字母开头的行,因为没有,小郭为了证实,在命令后面加了管道验证
grep 'r.o' test.txt
:列出test.txt内容里,格式为“r.o”的行(这里的格式是r和o中间必须有一个字母的,例如:rao、rbo、rio等(小郭甚是想喝一瓶rio了))
grep 'oo*' test.txt
:列出test.txt文件中所有包含o或者oo的行
grep '.*' test.txt
:列出test.txt文件中所有内容
grep 'o\{2\}' test.txt
:列出test.txt文件中格式为oo的行(必须是两个o且oo必须连在一起)
egrep 'o{2}' test.txt
:列出test.txt文件中格式为两个o或更多的o的行(含有两个o)
egrep 'o+' test.txt
:列出test.txt文件中格式为一个o或更多的o的行(含有一个o)
egrep 'oo?' /etc/passwd
:列出/etc/passwd文件中oo出现和没出现的行,若oo没出现则列出o出现的行
egrep 'root|nologin' /etc/passwd
:列出/etc/passwdt文件中包含root或包含nologin的行
egrep '(oo){2}' test.txt
:列出test.txt文件中00连在一起的行(这一行是小郭自己随便加的)
3. 正则三剑客二:sed
sed也可以实现grep的一些功能,但是稍麻烦,sed 的主要通能在于查找替换。
命令:sed
参数:
-n
∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e
∶直接在指令列模式上进行 sed 的动作编辑;
-f
∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r
∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i
∶直接修改读取的档案内容,而不是由萤幕输出。
a
∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c
∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d
∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i
∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p
∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s
∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
例子:
sed -n '$'p test.txt
:显示test.txt文件中最后一行的内容
sed -n '1,5'p test.txt
:显示test.txt文件中第一行到第五行的内容
sed -n '1,$'p test.txt
:显示test.txt文件中第一行到最后一行的内容
sed -n '/root/'p test.txt
:显示test.txt文件中含有root的行的内容
sed -n '/^1/'p test.txt
:显示test.txt文件中以1为开头的行的内容,因为没有,效果为了验证于是在命令后面加管道显示数字
sed -n '/in$/'p test.txt
:显示test.txt文件中所有以in为结尾的行的内容
sed -n '/r..o/'p test.txt
:显示r…o 中间任意2个字符的行
sed -e '1'p -e '/111/'p -n test.txt
:多条件匹配打印(或者关系, 或重合多次打印,符合条件1打印1次,符合条件2又打印1次)
sed '1'd test.txt
:显示test.txt删除第一行后的结果
sed '1,3'd test.txt
:显示test.txt删除第一行到第三行后的结果
sed '/oot/'d test.txt
:显示test.txt删除含有oot的行后的结果
sed '1,2s/ot/to/g' test.txt
:显示test.txt内的第一行和第二行里的ot换成to后的结果
sed 's#ot#to#g' test.txt
:示test.txt内的ot换成to后的结果
sed 's/[0-9]//g' test.txt
:显示test.txt文档中删除内容里的数字后的结果
sed 's/[a-zA-Z]//g' test.txt
:显示test.txt文档中删除内容里的英文字母后的结果
sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt
:
sed 's/^.*$/123&/' test.txt
:显示test.txt所有行都更换为以123开头的内容
sed -i 's/ot/to/g' test.txt
:将test.txt文件中的ot全部换成to,没有提示,但是命令运完成后保存
4.正则三剑客三:awk
awk是一种很棒的语言,它适合文本处理和报表生成。其语法较为常见,借鉴了某些语言的一些精华,如C语言等。
命令:awk
参数:
-F
: fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v
:var=value 赋值一个用户定义变量,将外部变量传递给awk
-f
:scripfile 从脚本文件中读取awk命令
例子:
head -n2 test.txt|awk -F ':' '{print $1}'
:查看test.txt的第一列的头两行
head -n2 test.txt|awk -F ':' '{print $0}'
:查看test.txt的头两行的所有数据
awk -F ':' '{print $1"#"$2"#"$3"#"$4}' test.txt
:查看test.txt第1列、第2列、第3列、第4列,并用“#”分开
awk '/oo/' test.txt
:查看test.txt文件中每一列凡是含有“oo”的数据,打印出含有oo数据的所在的列
awk -F ':' '$1 ~/oo/' test.txt
:查看test.txt文件中第一列中含有oo的数据
awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
:匹配root的行打印第1段和第3段且同时匹配user的行打印第1段和第3段,多个表达式一起写
awk -F ':' '$3=="0"' test.txt
:查看test.txt文件中第三列数值等于0所在的行的数据
awk -F ':' '$3>="500"' test.txt
:查看test.txt文件中第三列数值大于等于500所在的行的数据(500加双引号说明只让第三列的数值对500进行比较)
awk -F ':' '$3>=500' test.txt
:查看test.txt文件中第三列大于等于500所在的行的数据(不加双引号说明不对数据类型做要求)
awk -F ':' '$7!="/sbin/nologin"' test.txt
:查看test.txt文件中第七列不是/sbin/nologin所在的行的数据
awk -F ':' '$3<$4' test.txt
:查看test.txt文件中第三列数据大于第四列数据所在的行的数据
awk -F ':' '$3>"5" && $3<"7"' test.txt
:查看test.txt文件中第三列数据大于5且小于7的数据
awk -F ':' '$3>1000 || $7=="/bin/bash"' test.txt
:查看test.txt文件中第三列大于1000或者第七列是/bin/bash所在的行的数据
head -5 test.txt |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
:查看test.txt文件的第一列第三列第四列的前五行数据,并用#分开
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test.txt
:
head -n3 test.txt | awk -F ':' '{print NF}'
:查看test.txt文件中前三行有的列数(每行都是7列数据)
head -n3 test.txt | awk -F ':' '{print NR}'
:查看前三行有的行数
awk 'NR>40' test.txt
:查看test.txt文件中40行之后的数据,因为文件并没有40行所以小郭查看总数验证
awk -F ':' 'NR<20 && $1 ~ /roo/' test.txt
:查看test.txt文件中前20行并且第一列是root的行所在数据
head -n 3 test.txt |awk -F ':' '$1="root"‘
:查看三行test.txt文件中第一列为root的行所在的数据
awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt
:查看test.txt文件中第三列的所有数据进行累加后的值
awk -F ':' '{if ($1=="root") {print $0}}' test.txt·
:如果test.txt文件中第一列的数据为root,则打印所在行的所有数据