2019独角兽企业重金招聘Python工程师标准>>>
什么是正则
正则就是一串有规律的字符串
掌握好正则对于编写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