天天看点

正则表达式介绍及用法

文章目录

    • grep介绍
    • sed介绍
    • awk介绍

grep介绍

  • .表示任意一个字符
  • *表示零个或多个*前面的字符
  • .*表示任意个任意字符
  • ?表示0个或1个?前面的字符
  • +表示1个或多个+前面的字符
  • 正则就是一串有规律的字符串

过滤出有关键词的行:

[[email protected] grep]# grep 'nologin' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
           

过滤出含关键字的行,计算出有多少行:

[[email protected] grep]# grep -c 'nologin' passwd
18
           

过滤出含有关键字的行并列出行号:

[[email protected] grep]# grep 'nologin' passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
           

过滤出含有关键字的行(不区分大小写):

[[email protected] grep]# grep -i 'nologin' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
           

过滤出不含关键字的行:

[[email protected] grep]# grep -v 'nologin' passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
sync:x:5:0:sync:/sbin:/bin/sync
           
-r子目录、孙目录所有下面的文件全部遍历一遍

寻找该目录下含有关键字的文件的行:

[[email protected] grep]# grep -r 'root' /etc/
           

将含有关键字的行列出并且列出该行底下两行:

[[email protected] grep]# grep -A2 'root' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
           

将含有关键字的行列出并且列出该行上面两行:

[[email protected] grep]# grep -B2 'root' passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
           

过滤出含有数字的行:

[[email protected] grep]# grep '[0-9]' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
           

过滤出不含有数字的行:

[[email protected] grep]# grep -v '[0-9]' passwd
           

过滤出以关键字符开头的行并列出行号:

[[email protected] grep]# grep -n '^#' /etc/inittab
1:# inittab is no longer used when using systemd.
2:#
3:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
           

以非数字的字符开头的行:

[[email protected] grep]# grep '^[^0-9]' inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
           

含有非数字字符的行:

[[email protected] grep]# grep '[^0-9]' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/NOLOGIN
           

匹配r+任意一个字符+o的行:

[[email protected] ~]# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
           

匹配o+重复0到n次*左边的字符+o的行:

[[email protected] ~]# grep 'o*o' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/rooot:/bin/bash
root:x:0:0:root:/roooot:/bin/bash
           

任意个任意字符:

[[email protected] ~]# grep '.*' passwd
           

匹配出现两次o的行:

[[email protected] ~]# grep 'o\{2\}' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/rooot:/bin/bash
[[email protected] ~]# egrep 'o{2}' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/rooot:/bin/bash
[[email protected] ~]# grep -E 'o{2}' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/rooot:/bin/bash
           

匹配1次或多次+前面的字符:

[[email protected] ~]# [[email protected] ~]# grep 'o\+o' passwd
           

匹配含0次或1次?前面的字符:

[[email protected] ~]# grep 'o\?t' passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
           

两个关键字能匹配其中一个就列出:

[[email protected] ~]# grep -E 'root|nologin' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
           

sed介绍

匹配含有root的行:

[[email protected] sed]# sed -n '/root/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
           

匹配0个或多个r,后跟1个t的行:

[[email protected] sed]# sed -n '/r*t/'p test.txt
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
           

匹配1次或多次o,后跟一个t的行:

[[email protected] sed]# sed -nr '/o+t/'p test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
           
  • 加-r类似grep -E

打印指定行:

[[email protected] sed]# sed -n '2'p test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
           

打印指定范围的行:

[[email protected] sed]# sed -n '2,5'p test.txt
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
           

打印指定行到末尾行:

[[email protected] sed]# sed -n '22,$'p test.txt
ntp:x:38:38::/etc/ntp:/sbin/nologin
zhangfei:x:1000:1000::/home/zhangfei:/bin/bash
1242132532
zhang:x:1001:1001::/home/zhang:/bin/bash
           
  • -e 不仅将指定行打印出来,还要匹配字符串
[[email protected] sed]# sed -e '1'p -e '/bus/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[[email protected] sed]# sed -e '1'p -e '/bus/'p -e '/oo/'p -n test.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
           

匹配大写和小写字母:

[[email protected] sed]# sed -n '/bus/'Ip test.txt
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
           

删除指定的行(1到5行):

[[email protected] sed]# sed '1,5'd test.txt
           

删除包含指定关键词的行:

[[email protected] sed]# sed '/zhang/'d test.txt
           

关键词替换:

[[email protected] sed]# sed '1,10s/root/toor/g' test.txt
           
  • 1,10代表第一行到第十行
  • g代表全局替换

sed替换也可以使用正则:

[[email protected] sed]# sed -r '1,10s/ro+/r/g' test.txt
           

将每一行的首尾做替换:

[[email protected] sed]# head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'
/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
           

.* 贪婪匹配

  • 第一部分([^:]+)找到所有不包含:的内容
  • 第二部分(:.*:)通配第一个:之后的所有内容直到最后一个:
  • 第三部分([^:]+)找到所有不包含:的内容

连起来就是第一部分是第一个:之前的内容,第二部分就是第一个:和最后一个:之间的内容,第三部分就是最后一个:之后的内容

\3\2\1 就是前面的第一部分排在第三,第二部分不变,第三部分排在第一

如果是第一部分和第二部分换,那就是/2/1/3

将/root换成123:

[[email protected] sed]# head test.txt |sed 's/\/root/123/g'
root:x:0:0:root:123:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
           

删除英文字母:

[[email protected] sed]# head test.txt |sed 's/[a-zA-Z]//g'
::0:0::/://
::1:1::/://
           

在所有行前面加上固定的字符串:

[[email protected] sed]# head test.txt |sed -r 's/(.*)/aaa:&/'
aaa:root:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
           
  • &表示前面的小括号

awk介绍

以:为分隔符,打印第一段:

[[email protected] awk]# awk -F ':' '{print $1}' test.txt
           
如果没有规定分割符,系统默认会以空格符作为分隔符。

打印个别段:

[[email protected] awk]# awk -F ':' '{print $1,$3,$4}' test.txt
root 0 0
bin 1 1
daemon 2 2
           

指定显示的分隔符:

[[email protected] awk]# awk -F ':' '{print $1"#"$3"#"$4}' test.txt
root#0#0
bin#1#1
daemon#2#2
           

过滤出含有关键字的行:

[[email protected] awk]# awk '/oo/' test.txt 
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
           

匹配第一段含关键字的行:

[[email protected] awk]# awk -F ':' '$1 ~ /oo/' test.txt 
root:x:0:0:root:/root:/bin/bash
           
  • ~意为匹配

匹配含root关键字并打印出第1、3段,匹配出含user关键字的行并打印3、4段:

[[email protected] awk]# awk -F ':' '/root/ {print $1 ,$3} /user/ {print $3,$4}' test.txt 
root 0
operator 11
59 59
           

匹配含root或者zhang,并打印出整行:

[[email protected] awk]# awk -F ':' '/root|zhang/ {print $0}' test.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
zhangfei:x:1000:1000::/home/zhangfei:/bin/bash
zhang:x:1001:1001::/home/zhang:/bin/bash
           

匹配第三段等于0的行并且打印第一段:

[ro[email protected] awk]# awk -F ':' '$3==0 {print $1}' test.txt 
root
           

匹配第三段大于等于1000的行并且打印整行:

[[email protected] awk]# awk -F ':' '$3>=1000 {print $0}' test.txt
zhangfei:x:1000:1000::/home/zhangfei:/bin/bash
zhang:x:1001:1001::/home/zhang:/bin/bash
           
  • 加双引号,代表数字。

匹配某一段不为某字符的行:

[[email protected] awk]# awk -F ':' '$7!="/sbin/nologin"' test.txt 
[[email protected] awk]# awk -F ':' '$7!="/sbin/nologin"' test.txt 
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
           

段与段之间的比较:

[[email protected] awk]# awk -F ':' '$3<$4' test.txt 
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
           

将两组段进行对比,满足条件的行打印出来:(&&表示第一条命令执行成功然后才会执行第二条)

[[email protected] awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt
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
           

其中一条命令执行成功:

[[email protected] awk]# awk -F ':' '$3>1000 || $7=="/sbin/nologin"' test.txt
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
           

指定打印时的分隔符为#:

[[email protected] awk]# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' test.txt
root#0#/bin/bash
zhangfei#1000#/bin/bash
zhang#1001#/bin/bash
           
  • NR 表示行
  • NF 表示段

每一行前打印行号:

[[email protected] awk]# awk -F ':' '{print NR":"$0}' test.txt
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
           

将每一行的段数打印在每一行的行首:

[[email protected] awk]# awk -F ':' '{print NF":"$0}' test.txt 
7:root:x:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
7:daemon:x:2:2:daemon:/sbin:/sbin/nologin
7:adm:x:3:4:adm:/var/adm:/sbin/nologin
           

打印前十行:

[[email protected] awk]# awk -F ':' 'NR<=10' test.txt 
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
           

打印十行并且打印出第一段有root或者sync的行:

[[email protected] awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
           

打印出行数:段数:

[[email protected] awk]# awk -F ':' '{print $NR":"$NF}' test.txt 
root:/bin/bash
x:/sbin/nologin
2:/sbin/nologin
4:/sbin/nologin
           

匹配并且赋值:

[[email protected] awk]# head -n3 test.txt |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
           

匹配等于关键词的行:

[[email protected] awk]# head -n3 test.txt |awk -F ':' ' $1=="root"'
root:x:0:0:root:/root:/bin/bash
           

每一次循环都会把第三段的值相加:

[[email protected] awk]# awk -F ‘:’ '{(tot=tot+$3)};END {print tot}' test.txt
72
           

继续阅读