什么是正则
正则就是一串有规律的字符串掌握好正则对于编写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