正则表达式、grep、sed和awk

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

什么是正则

正则就是一串有规律的字符串
掌握好正则对于编写shell脚本有很大帮助
各种编程语言中都有正则,原理是一样的
本章将要学习grep/egrep、sed、awk


grep

 grep [-cinvABC] 'word' filename   //word可以用正则表达式
 -c 行数
 -i 不区分大小写
 -n 显示行号
 -v 取反
 -r 遍历所有子目录
 -A 后面跟数字,过滤出符合要求的行以及下面n行
 -B 同上,过滤出符合要求的行以及上面n行
 -C 同上,同时过滤出符合要求的行以及上下各n行


常见的正则表达式:

. 表示任意一个字符
* 表示*前面那个字符有零个或者多个
{} 表示一个范围
+ 表示匹配一个或多个+前面的字符
? 表示?前面的字符有零个或者1个
| 表示或者


案例测试:

[root@wangzb01 shelltest]# cp /etc/passwd ./test  //拷贝passwd文件到当前文件夹
[root@wangzb01 shelltest]# grep -n 'root' test  //结果显示行号
[root@wangzb01 shelltest]# grep -nv 'nologin' test   //结果取反并显示行号
[root@wangzb01 shelltest]# grep -A2 'root' test   //将查询结果所在行,以及改行后面2行打印出来
[root@wangzb01 shelltest]# cp /etc/inittab ./test2
[root@wangzb01 shelltest]# grep '[0-9]' test2  //取有数字的行
[root@wangzb01 shelltest]# grep -v '[0-9]' test2 //取没有数字的行
[root@wangzb01 shelltest]# grep -v '^#' test2  取不以#开头的行,#号开头的行取反
[root@wangzb01 shelltest]# grep -v '^#' test2 | grep -v  '^$'  //取不以#开头的行后,再取没有空格的行
[root@wangzb01 shelltest]# grep '^[^a-zA-Z]' test.txt  //取以字母开头的行
[root@wangzb01 shelltest]# grep 'r.o' test  //r和o中间匹配任意一个字符的行
[root@wangzb01 shelltest]# grep 'oo*' test  //*表示任意多个任意字符
[root@wangzb01 shelltest]# grep '.*' test
[root@wangzb01 shelltest]# grep 'o\{2\}' test   //连续两个o的行
[root@wangzb01 shelltest]# egrep 'o{2}' test  //连续两个o的行
[root@wangzb01 shelltest]# egrep 'o+' test   //+,匹配带有一个或多个+前面的字符的行
[root@wangzb01 shelltest]# egrep 'oo?' test
[root@wangzb01 shelltest]# egrep 'root|nologin' test
[root@wangzb01 shelltest]# egrep '(oo){2}' test


sed

 sed -n '5'p test
 	[root@wangzb01 sed]# sed -n '5'p test
	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 sed -n '1,5'p test
 	[root@wangzb01 sed]# sed -n '1,5'p test
	root:x:0:0:root:/root:/bin/bash
	bin:x:1:1:bin:/bin:/sbin/nologin
	daemon:x:2:2:daemon:/sbin:/sbin/nologin
	adm:x:3:4:adm:/var/adm:/sbin/nologin
	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 sed -n '1,$'p test
 	[root@wangzb01 sed]# sed -n '25,$'p test
	ftpuser:x:1003:1003::/home/ftpuser:/bin/bash
	tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
	tcpdump:x:72:72::/:/sbin/nologin
	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
	zabbix:x:995:992:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
 sed -n '/root/'p test
 	[root@wangzb01 sed]# sed -n '/root/'p test
	root:x:0:0:root:/root:/bin/bash
	operator:x:11:0:operator:/root:/sbin/nologin
 sed -n '/^1/'p test
 	[root@wangzb01 sed]# sed -n '/^1/'p test
	12ab
 sed -n 'in$'p test
 sed -n '/r..o/'p test
 	[root@wangzb01 sed]# sed -n '/r..o/'p test
	operator:x:11:0:operator:/root:/sbin/nologin
	polkitd:x:999:998:User for polkitd:/:/sbin/nologin
	unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
 sed -n '/oo*/'p test
 	[root@wangzb01 sed]# sed -n '/oo*/'p test
	root:x:0:0:root:/root:/bin/bash
	bin:x:1:1:bin:/bin:/sbin/nologin
	daemon:x:2:2:daemon:/sbin:/sbin/nologin
	adm:x:3:4:adm:/var/adm:/sbin/nologin
	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
	operator:x:11:0:operator:/root:/sbin/nologin
	games:x:12:100:games:/usr/games:/sbin/nologin
	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
	nobody:x:99:99:Nobody:/:/sbin/nologin
	systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
	dbus:x:81:81:System message bus:/:/sbin/nologin
	polkitd:x:999:998:User for polkitd:/:/sbin/nologin
	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
	postfix:x:89:89::/var/spool/postfix:/sbin/nologin
	chrony:x:998:996::/var/lib/chrony:/sbin/nologin
	user1:x:1000:1000::/home/user1:/bin/bash
	mysql:x:1001:1001::/home/mysql:/bin/nologin
	unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
	php-fpm:x:1002:1002::/home/php-fpm:/bin/bash
	nginx:x:996:994:nginx user:/var/cache/nginx:/sbin/nologin
	ftpuser:x:1003:1003::/home/ftpuser:/bin/bash
	tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
	tcpdump:x:72:72::/:/sbin/nologin
	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
	zabbix:x:995:992:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
 sed -e '1'p -e '/r..o/'p -n test
 	[root@wangzb01 sed]# sed -e '1'p -e '/r..o/'p -n test
	root:x:0:0:root:/root:/bin/bash
	operator:x:11:0:operator:/root:/sbin/nologin
	polkitd:x:999:998:User for polkitd:/:/sbin/nologin
	unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
 sed '1'd test    //删除第一行,打印出后面行内容
 sed '1,3'd test    //删除1,3行,打印出后面的内容
 sed '/oot/'d test      
 sed '1,2s/ot/to/g' test 
 	[root@wangzb01 sed]# sed '1,2s/ot/to/g' test | sed -n '1,2'p
	roto:x:0:0:roto:/roto:/bin/bash
	bin:x:1:1:bin:/bin:/sbin/nologin
 sed 's#ot#to#g' test
 	[root@wangzb01 sed]# sed '1,5s@/sbin@wangzb@g' test | sed -n '1,5'p
	root:x:0:0:root:/root:/bin/bash
	bin:x:1:1:bin:/bin:wangzb/nologin
	daemon:x:2:2:daemon:wangzb:wangzb/nologin
	adm:x:3:4:adm:/var/adm:wangzb/nologin
	lp:x:4:7:lp:/var/spool/lpd:wangzb/nologin
	[root@wangzb01 sed]# sed '1,5s#/sbin#wangzb#g' test |sed -n '1,5'p
	root:x:0:0:root:/root:/bin/bash
	bin:x:1:1:bin:/bin:wangzb/nologin
	daemon:x:2:2:daemon:wangzb:wangzb/nologin
	adm:x:3:4:adm:/var/adm:wangzb/nologin
	lp:x:4:7:lp:/var/spool/lpd:wangzb/nologin
 sed 's/[0-9]//g' test
 	[root@wangzb01 sed]# sed 's/[0-9]//g' test | sed -n '1,5'p
	root:x:::root:/root:/bin/bash
	bin:x:::bin:/bin:/sbin/nologin
	daemon:x:::daemon:/sbin:/sbin/nologin
	adm:x:::adm:/var/adm:/sbin/nologin
	lp:x:::lp:/var/spool/lpd:/sbin/nologin
 sed 's/[a-zA-Z]//g' test
 	[root@wangzb01 sed]# sed '1,5s/[a-zA-Z]//g' test | sed -n '1,5'p
	::0:0::/://
	::1:1::/://
	::2:2::/://
	::3:4:://://
	::4:7::///://
 sed -r 's/(rot)(.*)(bash)/\3\2\1/' test
 	[root@wangzb01 sed]# sed -n '1,5'p test
	root:x:0:0:root:/root:/bin/bash
	bin:x:1:1:bin:/bin:/sbin/nologin
	daemon:x:2:2:daemon:/sbin:/sbin/nologin
	adm:x:3:4:adm:/var/adm:/sbin/nologin
	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
	[root@wangzb01 sed]# sed -r '1,5s/(^[^:]+)(:.*:)([^:]+)$/\3\2\1/' test | sed -n '1,5'p
	/bin/bash:x:0:0:root:/root:root
	/sbin/nologin:x:1:1:bin:/bin:bin
	/sbin/nologin:x:2:2:daemon:/sbin:daemon
	/sbin/nologin:x:3:4:adm:/var/adm:adm
	/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp
 sed 's/^.*$/123&/' test   //在所有行前面加上123
 	[root@wangzb01 sed]# sed -n '1,5s/^.*$/123&/'p test 
	123root:x:0:0:root:/root:/bin/bash
	123bin:x:1:1:bin:/bin:/sbin/nologin
	123daemon:x:2:2:daemon:/sbin:/sbin/nologin
	123adm:x:3:4:adm:/var/adm:/sbin/nologin
	123lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
	[root@wangzb01 sed]# sed -n '1,5s/^.*$/&123/'p test
	root:x:0:0:root:/root:/bin/bash123
	bin:x:1:1:bin:/bin:/sbin/nologin123
	daemon:x:2:2:daemon:/sbin:/sbin/nologin123
	adm:x:3:4:adm:/var/adm:/sbin/nologin123
	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin123
 sed -i 's/ot/to/g' test   //直接更改文件中的内容

awk

 [root@wangzb01 awk]# mkdir awk
 [root@wangzb01 awk]# cd awk/
 	[root@wangzb01 awk]# pwd
	/root/awk
 [root@wangzb01 awk]# cp /etc/passwd ./test
 head -n2 test.txt|awk -F ':' '{print $1}'
	[root@wangzb01 awk]# head -5 test | awk -F ':' '{print$1}'
	root
	bin
	daemon
	adm
	lp
 head -n2 test.txt|awk -F ':' '{print $0}'  //$0可以打印一整行
	[root@wangzb01 awk]# head -5 test | awk -F ':' '{print$0}'
	root:x:0:0:root:/root:/bin/bash
	bin:x:1:1:bin:/bin:/sbin/nologin
	daemon:x:2:2:daemon:/sbin:/sbin/nologin
	adm:x:3:4:adm:/var/adm:/sbin/nologin
	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
	[root@wangzb01 awk]# head -5 test | awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
	root#x#0#0
	bin#x#1#1
	daemon#x#2#2
	adm#x#3#4
	lp#x#4#7
 awk '/oo/' test
 	[root@wangzb01 awk]# head -5 test | awk '/oo/'
	root:x:0:0:root:/root:/bin/bash
	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 awk -F ':' '$1 ~/oo/' test
	[root@wangzb01 awk]# head -5 test | awk -F ':' '$1 ~/oo/'
	root:x:0:0:root:/root:/bin/bash
 awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test
	[root@wangzb01 awk]# head -5 test |  awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test
	root 0
	operator 11
 awk -F ':' '$3=="0"' /etc/passwd
 	[root@wangzb01 awk]# awk -F ':' '$3=="0"' test
	root:x:0:0:root:/root:/bin/bash
 awk -F ':' '$3>="500"' /etc/passwd
 [root@wangzb01 awk]# head -5 test | awk -F ':' '$3=="0"' /etc/passwd
	root:x:0:0:root:/root:/bin/bash
 awk -F ':' '$3>=500' /etc/passwd
 	[root@wangzb01 awk]#  awk -F ':' '$3>=500' test
	polkitd:x:999:998:User for polkitd:/:/sbin/nologin
	chrony:x:998:996::/var/lib/chrony:/sbin/nologin
	user1:x:1000:1000::/home/user1:/bin/bash
	mysql:x:1001:1001::/home/mysql:/bin/nologin
	unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
	php-fpm:x:1002:1002::/home/php-fpm:/bin/bash
	nginx:x:996:994:nginx user:/var/cache/nginx:/sbin/nologin
	ftpuser:x:1003:1003::/home/ftpuser:/bin/bash
	zabbix:x:995:992:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
 awk -F ':' '$7!="/sbin/nologin"' test
	 [root@wangzb01 awk]# awk -F ':' '$7!="/sbin/nologin"' test
	root:x:0:0:root:/root:/bin/bash
	sync:x:5:0:sync:/sbin:/bin/sync
	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
	halt:x:7:0:halt:/sbin:/sbin/halt
	user1:x:1000:1000::/home/user1:/bin/bash
	mysql:x:1001:1001::/home/mysql:/bin/nologin
	php-fpm:x:1002:1002::/home/php-fpm:/bin/bash
	ftpuser:x:1003:1003::/home/ftpuser:/bin/bash
 awk -F ':' '$3<$4' test
 	[root@wangzb01 awk]# awk -F ':' '$3<$4' test
	adm:x:3:4:adm:/var/adm:/sbin/nologin
	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
	games:x:12:100:games:/usr/games:/sbin/nologin
	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 awk -F ':' '$3>"5" && $3<"7"' test
 	[root@wangzb01 awk]# awk -F ':' '$3>"5" && $3<"7"' test
	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
	tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
 awk -F ':' '$3>1000 || $7=="/bin/bash"' test
 	[root@wangzb01 awk]# awk -F ':' '$3>1000 || $7=="/bin/bash"' test
	root:x:0:0:root:/root:/bin/bash
	user1:x:1000:1000::/home/user1:/bin/bash
	mysql:x:1001:1001::/home/mysql:/bin/nologin
	php-fpm:x:1002:1002::/home/php-fpm:/bin/bash
	ftpuser:x:1003:1003::/home/ftpuser:/bin/bash
 head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}'
 	[root@wangzb01 awk]# head -5 test |awk -F ':' '{OFS="#"} {print $1,$3,$4}'
	root#0#0
	bin#1#1
	daemon#2#2
	adm#3#4
	lp#4#7
 awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test
	[root@wangzb01 awk]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test
	mysql#x#1001#1001
	php-fpm#x#1002#1002
	ftpuser#x#1003#1003

 head -n3 /etc/passwd | awk -F ':' '{print NF}'
 	[root@wangzb01 awk]# head -n3 test | awk -F ':' '{print NF}'
	7
	7
 head -n3 test | awk -F ':' '{print NR}'
 [root@wangzb01 awk]# head -n3 test | awk -F ':' '{print NR}'
	1
	2
	3
 awk 'NR>40' test
 	[root@wangzb01 awk]# awk 'NR>26' test
	tcpdump:x:72:72::/:/sbin/nologin
	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
	zabbix:x:995:992:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
 awk -F ':' 'NR<20 && $1 ~ /roo/' test
 	[root@wangzb01 awk]# awk -F ':' 'NR<20 && $1 ~ /roo/' test
	root:x:0:0:root:/root:/bin/bash
 head -n 3 test |awk -F ':' '$1="root"'
 	[root@wangzb01 awk]# head -n 3 test |awk -F ':' '$1="root"'
	root x 0 0 root /root /bin/bash
	root x 1 1 bin /bin /sbin/nologin
	root x 2 2 daemon /sbin /sbin/nologin
 awk -F ':' '{(tot=tot+$3)}; END {print tot}' test
 	[root@wangzb01 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test
	9778
	[root@wangzb01 awk]# awk -F ':' '{(tot=$3+$4)}; END {print tot}' test 
	1987

 awk -F ':' '{if ($1=="root") {print $0}}' test
 	[root@wangzb01 awk]# awk -F ':' '{if ($1=="root") {print $0}}' test
	root:x:0:0:root:/root:/bin/bash


转载于:https://my.oschina.net/u/3954059/blog/3021673

你可能感兴趣的:(正则表达式、grep、sed和awk)