正则表达式

一种指定的字符串 有四个工具 grep egrep  sed awk

grep 过滤

 1 [root@ASU ~]# cp /etc/passwd 2.txt
 2 cp:是否覆盖"2.txt"? y
 3 [root@ASU ~]# grep --color 'root' 2.txt
 4 root:x:0:0:root:/root:/bin/bash
 5 operator:x:11:0:operator:/root:/sbin/nologin
 6 [root@ASU ~]# grep --color -c  'root' 2.txt
 7 2
 8 [root@ASU ~]# grep --color -v  'root' 2.txt (不包含root的行)
 9 bin:x:1:1:bin:/bin:/sbin/nologin
10 daemon:x:2:2:daemon:/sbin:/sbin/nologin
11 adm:x:3:4:adm:/var/adm:/sbin/nologin
12 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
13 sync:x:5:0:sync:/sbin:/bin/sync
14 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
15 halt:x:7:0:halt:/sbin:/sbin/halt
16 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
17 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
18 games:x:12:100:games:/usr/games:/sbin/nologin
19 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
20 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
21 nobody:x:99:99:Nobody:/:/sbin/nologin
22 dbus:x:81:81:System message bus:/:/sbin/nologin
23 vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
24 rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
25 saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
26 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
27 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
28 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
29 haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
30 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
31 asu:x:500:500::/home/asu:/bin/bash
32 user1:x:502:501::/home/user1:/bin/bash
33 user2:x:503:503::/home/user2:/bin/bash
34 [root@ASU ~]# grep --color -cn  'root' 2.txt
35 2
36 [root@ASU ~]# grep --color -n  'root' 2.txt (列出行数)
37 1:root:x:0:0:root:/root:/bin/bash
38 11:operator:x:11:0:operator:/root:/sbin/nologin

grep -A(显示包含下面两行) -B(上面两行) -C(上下两行)-r 遍历子目录及其递归目录 -n显示行号 -v 取反 -c行数 -i 不区分大小写

 1 [root@ASU ~]# gc -A 2 'root' 2.txt
 2 root:x:0:0:root:/root:/bin/bash
 3 bin:x:1:1:bin:/bin:/sbin/nologin
 4 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 5 --
 6 operator:x:11:0:operator:/root:/sbin/nologin
 7 games:x:12:100:games:/usr/games:/sbin/nologin
 8 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
 9 [root@ASU ~]# gc -n -B 2 'root' 2.txt
10 1:root:x:0:0:root:/root:/bin/bash
11 --
12 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
13 10-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
14 11:operator:x:11:0:operator:/root:/sbin/nologin
15 [root@ASU ~]# gc -n -C 2 'games' 2.txt
16 10-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
17 11-operator:x:11:0:operator:/root:/sbin/nologin
18 12:games:x:12:100:games:/usr/games:/sbin/nologin
19 13-gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
20 14-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
21 [root@ASU ~]# gc -r 遍历目录^C  -h不显示一些出错信息  grep -rh

grep 支持和正则表达式一起使用

[root@ASU ~]# gc '[a-zA-Z]' 2.txt^C 包含字母的行

[root@ASU ~]# gc -v '[a-zA-Z]' 2.txt^C不包含字母的行
[root@ASU ~]# gc ^'[0-9]' 2.txt^C 以数字开头的行

                        gc -v ^'[0-9]'  不以数字开头的行(包含空行)
[root@ASU ~]# gc '[^0-9]' 2.txt^C 0-9数字以外的行

[root@ASU ~]# gc ^'[^0-9]' 2.txt^C 不以数字开头的行(不包含空行)

[root@ASU ~]# gc -v '^$' 2.txt 不包含空格的行

[root@asulinux ~]# grep -n --color '^$' inittab 找出空行
16:
29:

 [root@asulinux ~]# grep -n --color '^#' inittab  以#开头的行

[root@asulinux ~]# grep -n --color '[^#]' inittab  不包含#的行,这行有#号又有别的字符也会过滤出来

[root@asulinux ~]# grep -n --color '[^#]' inittab
1:# inittab is only used by upstart for the default runlevel.
3:# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
5:# System initialization is started by /etc/init/rcS.conf
7:# Individual runlevels are started by /etc/init/rc.conf
9:# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
11:# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
12:# with configuration in /etc/sysconfig/init.
14:# For information on how to write upstart event handlers, or how
15:# upstart works, see init(5), init(8), and initctl(8).
17:# Default runlevel. The runlevels used are:
18:# 0 - halt (Do NOT set initdefault to this)
19:# 1 - Single user mode
20:# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
21:# 3 - Full multiuser mode
22:# 4 - unused
23:# 5 - X11
24:# 6 - reboot (Do NOT set initdefault to this)
25:#
26:id:3:initdefault:
27:sadasffggeeeeeeeettaaa
28:dsfdsgdsgsd#sadasffgg11

[root@asulinux ~]# grep -vn --color '[^#]' inittab 只包含#的行(注意只包含和包含有很大的区别)

[root@asulinux ~]# grep -vn --color '[^#]' inittab
2:#
4:#
6:#
8:#
10:#
13:#
16:#

(需要注意加中括号和不加中括号的含义,不加意味着以什么开头 加中括号为非,差点搞蒙了)

cg  'r\?o' 2.txt=cg -E 'r?o' 2.txt =egrep     'r.*o'  贪婪匹配,r-o之间的字符串

[root@ASU ~]# gc -E 'r+o' 2.txt(至少一个或多个r  +o)
root:x:0:0:root:/root:/bin/bash
operatrrror:x:11:0:operator:/root:/sbin/nologin

[root@ASU ~]# gc -E 'nologin|root' 2.txt 含有root或者nologin的行

[root@ASU ~]# gc -E 'nologin' 2.txt|gc 'root'   含有root且还有nologin的行

sed 

打印第十行

1 [root@ASU ~]# sed -n '10'p 2.txt
2 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

 

含有root的行

1 [root@ASU ~]# sed -n '/root/'p 2.txt
2 root:x:0:0:root:/root:/bin/bash
3 operatrrrrrrrrrrrrror:x:11:0:operator:/root:/sbin/nologin

同样适用于各种匹配(注意脱意)

1 [root@ASU ~]# sed -n '/r.*o/'p 2.txt
2 root:x:0:0:root:/root:/bin/bash
3 adm:x:3:4:adm:/var/adm:/sbin/nologin
4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
5 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
1 [root@ASU ~]# sed -r -n '/root|nologin/'p 2.txt
2 root:x:0:0:root:/root:/bin/bash
3 bin:x:1:1:bin:/bin:/sbin/nologin
4 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 
6 [root@ASU ~]# sed -r -n '/^$/'p 2.txt

-r 脱意

删除包含数字;字母的行(只是显示的删除实际并未删除)

2 [root@ASU ~]# sed '/[0-9]/'d 2.txt
3 
4 @#$#%#@$^%%^#%$&#$%&^**(
5 [root@ASU ~]# sed '/[a-zA-Z]/'d 2.txt
6 
7 5645464987998645123
8 @#$#%#@$^%%^#%$&#$%&^**(

实际删除 -i

[root@ASU ~]# sed -i '1,19'd 2.txt删除1到19行  
[root@ASU ~]# wc -l 2.txt
11 2.txt
 1 [root@ASU ~]# sed '6d;8d' 2.txt 删除第六行和第八行
 2 
 3 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
 4 5645464987998645123
 5 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
 6 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
 7 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
 8 user1:x:502:501::/home/user1:/bin/bash
 9 user2:x:503:503::/home/user2:/bin/bash
10 @#$#%#@$^%%^#%$&#$%&^**(
11 [root@ASU ~]# !cat
12 cat -n 2.txt
13      1
14      2  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
15      3  5645464987998645123
16      4  rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
17      5  nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
18      6  haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
19      7  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
20      8  asu:x:500:500::/home/asu:/bin/bash
21      9  user1:x:502:501::/home/user1:/bin/bash
22     10  user2:x:503:503::/home/user2:/bin/bash
23     11  @#$#%#@$^%%^#%$&#$%&^**(
24 [root@ASU ~]# sed -i '6d;8d' 2.txt
25 [root@ASU ~]# cat -n 2.txt
26      1
27      2  postfix:x:89:89::/var/spool/postfix:/sbin/nologin
28      3  5645464987998645123
29      4  rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
30      5  nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
31      6  sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
32      7  user1:x:502:501::/home/user1:/bin/bash
33      8  user2:x:503:503::/home/user2:/bin/bash
34      9  @#$#%#@$^%%^#%$&#$%&^**(

 

关于替换

1 [root@ASU ~]# sed '1,20s#/sbin/nologin#abc#g' 2.txt
2 root:x:0:0:root:/root:/bin/bash
3 bin:x:1:1:bin:/bin:abc
4 daemon:x:2:2:daemon:/sbin:abc
5 adm:x:3:4:adm:/var/adm:abc
6 lp:x:4:7:lp:/var/spool/lpd:abc

在所有行后面加上abc &符号

 1 [root@ASU ~]# sed 's#^.*#& abc#' 2.txt
 2 root:x:0:0:root:/root:/bin/bash abc
 3 bin:x:1:1:bin:/bin:/sbin/nologin abc
 4 daemon:x:2:2:daemon:/sbin:/sbin/nologin abc
 5 adm:x:3:4:adm:/var/adm:/sbin/nologin abc
 6 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin abc
 7 sync:x:5:0:sync:/sbin:/bin/sync abc
 8 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown abc
 9 halt:x:7:0:halt:/sbin:/sbin/halt abc
10 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin abc
11 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin abc
12 operator:x:11:0:operator:/root:/sbin/nologin abc
13 games:x:12:100:games:/usr/games:/sbin/nologin abc

删除所有数字

 1 [root@ASU ~]# sed 's#[0-9]##g' 2.txt
 2 root:x:::root:/root:/bin/bash
 3 bin:x:::bin:/bin:/sbin/nologin
 4 daemon:x:::daemon:/sbin:/sbin/nologin
 5 adm:x:::adm:/var/adm:/sbin/nologin
 6 lp:x:::lp:/var/spool/lpd:/sbin/nologin
 7 sync:x:::sync:/sbin:/bin/sync
 8 shutdown:x:::shutdown:/sbin:/sbin/shutdown
 9 halt:x:::halt:/sbin:/sbin/halt
10 mail:x:::mail:/var/spool/mail:/sbin/nologin
11 uucp:x:::uucp:/var/spool/uucp:/sbin/nologin
12 operator:x:::operator:/root:/sbin/nologin
13 games:x:::games:/usr/games:/sbin/nologin

删除所有特殊字符

 1 [root@ASU ~]# sed 's#[^0-9a-zA-Z]##g' 2.txt
 2 rootx00rootrootbinbash
 3 binx11binbinsbinnologin
 4 daemonx22daemonsbinsbinnologin
 5 admx34admvaradmsbinnologin
 6 lpx47lpvarspoollpdsbinnologin
 7 syncx50syncsbinbinsync
 8 shutdownx60shutdownsbinsbinshutdown
 9 haltx70haltsbinsbinhalt
10 mailx812mailvarspoolmailsbinnologin
11 uucpx1014uucpvarspooluucpsbinnologin
12 operatorx110operatorrootsbinnologin
13 gamesx12100gamesusrgamessbinnologin

 把/etc/passwd文件第一段username和最后一段shell调换

[root@ASU ~]# sed -r 's/(^[a-z0-9]+)(:.*:)(.*)/\3\2\1/g' 2.txt
/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
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:10:14:uucp:/var/spool/uucp:uucp
/sbin/nologin:x:11:0:operator:/root:operator
/sbin/nologin:x:12:100:games:/usr/games:games321
[root@ASU ~]# sed -r 's/([^:]+)(:.*:)([^:]+)/\3\2\1/' 2.txt
/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
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
/sbin/nologin:x:10:14:uucp:/var/spool/uucp:uucp
/sbin/nologin:x:11:0:operator:/root:operator
/sbin/nologin:x:12:100:games:/usr/games:games321

并且;或者|

1 [root@ASU ~]#  sed -n '/root/p; /user/p' 2.txt
2 root:x:0:0:root:/root:/bin/bash
3 operator:x:11:0:operator:/root:/sbin/nologin
4 ================================等于
5 [root@ASU ~]# sed -n -e '/user/p' -e '/root/p' 2.txt
6 root:x:0:0:root:/root:/bin/bash
7 operator:x:11:0:operator:/root:/sbin/nologin
1 [root@ASU ~]# sed -r -n '/root|var/p' 2.txt
2 root:x:0:0:root:/root:/bin/bash
3 adm:x:3:4:adm:/var/adm:/sbin/nologin
4 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
5 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
6 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
7 operator:x:11:0:operator:/root:/sbin/nologin
 1 [root@ASU ~]# sed -r 's/([a-zA-Z][a-zA-Z]*)([^a-zA-Z].*)([^a-zA-Z])([a-zA-Z][a-zA-Z]*)/\4\2\3\1/' 2.txt
 2 bash:x:0:0:root:/root:/bin/root
 3 nologin:x:1:1:bin:/bin:/sbin/bin
 4 nologin:x:2:2:daemon:/sbin:/sbin/daemon
 5 nologin:x:3:4:adm:/var/adm:/sbin/adm
 6 nologin:x:4:7:lp:/var/spool/lpd:/sbin/lp
 7 sync:x:5:0:sync:/sbin:/bin/sync
 8 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
 9 halt:x:7:0:halt:/sbin:/sbin/halt
10 nologin:x:8:12:mail:/var/spool/mail:/sbin/mail
11 nologin:x:10:14:uucp:/var/spool/uucp:/sbin/uucp
12 nologin:x:11:0:operator:/root:/sbin/operator
13 nologin321:x:12:100:games:/usr/games:/sbin/games

awk命令  

 1 [root@ASU ~]# awk -F':' 'OFS="#" {print $3,$4}' 2.txt  -F:(指定分隔符) OFS=#% 指定分割的符号 
 2 0#0
 3 1#1
 4 2#2
 5 3#4
 6 4#7
 7 5#0
 8 6#0
 9 7#0
10 8#12
11 10#14
12 11#0
13 12#100
 1 [root@ASU ~]# awk '/root/' 2.txt     可以匹配字母,不需要脱意
 2 root:x:0:0:root:/root:/bin/bash
 3 operator:x:11:0:operator:/root:/sbin/nologin
 4 [root@ASU ~]# awk '/root|var/' 2.txt
 5 root:x:0:0:root:/root:/bin/bash
 6 adm:x:3:4:adm:/var/adm:/sbin/nologin
 7 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
 9 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 [root@ASU ~]# awk '/r?o/' 2.txt
12 root:x:0:0:root:/root:/bin/bash
13 bin:x:1:1:bin:/bin:/sbin/nologin
14 daemon:x:2:2:daemon:/sbin:/sbin/nologin
15 adm:x:3:4:adm:/var/adm:/sbin/nologin
16 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
17 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
18 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
19 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
20 operator:x:11:0:operator:/root:/sbin/nologin
21 games321:x:12:100:games:/usr/games:/sbin/nologin

包含r*o的第一段

[root@ASU ~]# awk -F':' '$1~/r*o/' 2.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin
[root@ASU ~]# awk -F':' '$1~/r*o/{$3}' 2.txt
[root@ASU ~]# awk -F':' '$1~/r*o/ {print $3}' 2.txt ()
0
2
6
11

多次匹配

[root@ASU ~]# awk -F':' '$1~/r*o/ {print $1,$3}; $1~/user/ {print $1,$3}' 2.txt
root 0
daemon 2
shutdown 6
operator 11
[root@ASU ~]# awk -F':' '$1~/r*o/ {print $1,$3}; $1~/root/ {print $1,$3}' 2.txt
root 0
root 0
daemon 2
shutdown 6
operator 11

[root@ASU ~]# awk -F':' '$1~/r*o|root/ {print $1,$3}' 2.txt
root 0
daemon 2
shutdown 6
operator 11
[root@ASU ~]#

命令awk -F ':' '$1 ~ /(ab)+|o{1,3}/' 1.txt会过滤出下面哪些行?

 
正确答案: A,C,D

grep sed 都是支持 {1,3}这样的匹配规则的,表示重复前面字符1到3次。但是awk属于一个比较复杂的脚本语言,在它里面()和{}都是有特殊含义的,所以我们要使用这些符号时,需要给他们脱义,你可能会想到使用\脱义,但是不管用。有一个方法就是加上--posix选项就ok ,比如
awk --posix -F ':' '$1 ~ /(ab)+|o{1,3}/' 1.txt
这样就可以把B选项匹配出来啦。

http://www.cnblogs.com/emanlee/p/3327576.html

内置变量  OFS  NR NF

awk -F ':' '{print NR}' 2.txt

NR表示行数,$NR就是和行相同数字的段的值

NF表示段数

[root@ASU ~]# awk -F ':' '{print NF}' 2.txt
7

 1 [root@ASU ~]# awk -F ':' '{print $NR,$NF}' 2.txt
 2 root /bin/bash
 3 x /sbin/nologin
 4 2 /sbin/nologin
 5 4 /sbin/nologin
 6 lp /sbin/nologin
 7 /sbin /bin/sync
 8 /sbin/shutdown /sbin/shutdown
 9  /sbin/halt
10  /sbin/nologin
11  /sbin/nologin
12  /sbin/nologin
13  /sbin/nologin

可以运算

 1 [root@ASU ~]# awk -F ':' '$7=$3+$4' 2.txt
 2 bin x 1 1 bin /bin 2
 3 daemon x 2 2 daemon /sbin 4
 4 adm x 3 4 adm /var/adm 7
 5 lp x 4 7 lp /var/spool/lpd 11
 6 sync x 5 0 sync /sbin 5
 7 shutdown x 6 0 shutdown /sbin 6
 8 halt x 7 0 halt /sbin 7
 9 mail x 8 12 mail /var/spool/mail 20
10 uucp x 10 14 uucp /var/spool/uucp 24
11 operator x 11 0 operator /root 11
12 games321 x 12 100 games /usr/games 112
13 [root@ASU ~]# awk -F ':' 'OFS="#" {$7=$3+$4;print $0}' 2.txt
14 root#x#0#0#root#/root#0
15 bin#x#1#1#bin#/bin#2
16 daemon#x#2#2#daemon#/sbin#4
17 adm#x#3#4#adm#/var/adm#7
18 lp#x#4#7#lp#/var/spool/lpd#11
19 sync#x#5#0#sync#/sbin#5
20 shutdown#x#6#0#shutdown#/sbin#6
21 halt#x#7#0#halt#/sbin#7
22 mail#x#8#12#mail#/var/spool/mail#20
23 uucp#x#10#14#uucp#/var/spool/uucp#24
24 operator#x#11#0#operator#/root#11
25 games321#x#12#100#games#/usr/games#112
1 [root@ASU ~]# awk -F ':' '{(sum=sum+$3)}; END {print sum}' 2.txt
2 69

 

posted @ 2020-07-27 15:53  拾年磨一剑  阅读(136)  评论(0)    收藏  举报