正则表达式
一种指定的字符串 有四个工具 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会过滤出下面哪些行?
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

浙公网安备 33010602011771号