文本处理工具 grep awk sed完全解读
正则表达式单字符
- 1特定字符 : 某个具体的字符 'a'
- 2范围内字符 : [a-zA-Z]
- 3任意字符 : . // grep . file // 如果点放到中括号中[.] 或者用反斜杠'\.' 则它不代表任意一个字符,而代表它本身 例如 grep '\.' file
- 4反向字符 [^a-z] [^0]
正则表达式其他符号
- 边界字符 : 头字符 ^ : ^root 注意与 [^] 的区别
- 边界字符 : 尾字符 $ : false$ 空行表示为 ^$
- 元字符 :
\w 代表着普通字符或者特殊字符 匹配任何字类字符,包括下划线 [A-Za-z0-9_]
\W 代表任何非字类字符 [^A-Za-z0-9_]
\b 单词的分割 grep '\bx\b' passwd 为 x为单独单词的数据
正则表达式字符组合
- 字符串 : 'root' '1000' 'm..c' m开头c结束长度为4的字符串 '[A-Z][a-z]' '\b[0-9][0-9]\b' 两位数
- 重复
- 逻辑
重复
- * : 0次或多次 匹配前面的字符或表达式 grep 'se*' passed
- + : 1次或多次 匹配前面的字符或表达式 grep 'se\+' passed + 号 出现在字符串中时代表它本身,如果作为重复表达式使用时必须加上\
- ? : 0次或一次 匹配前面的字符或表达式 grep 'se\?' ? 作为重复表达式使用必须加上\ 同上加号
- {n,m} :重复指定次数 {0,} 注意 大括号需要进行转义
上面是对单个字符的重复,如果对字符串的重复可以使用() 其中,括号使用在字符串中时加上\
(se)* 如 : grep '\(se\)*' passwd
(se)+ 如 : grep '\(se\)\+' passwd
(se)? 如 : grep '\(se\)\?' passwd
(se){2,3} 如 : grep '\(se\)\{2,3\}' passwd
任意字符表达式 : .
任意的字符串 '.*'
grep '^r.*' passwd
'm.*c' 'm..c' '\bm.*c\b' '\bm[a-z]*c\b'
逻辑的表示
| : grep 'bin/\(false\|true\)' passwd () 和 | 在正则表达式中不能单独出现,必须加上\ 反斜杠
正则表达式案例
匹配4-10位qq号
grep '^[0-9]\{4.10\}$' qq.txt
匹配15位或18位身份证号 (支持带X的)
grep '^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$' qq.txt
匹配密码 (由数字 26个字母和下划线组成)
grep '^\w\+' qq.txt
正则表达式中符号必须转义的有
| () {} + ?
正则练习
- grep OR操作:
- grep 'pattern1|pattern2' filename
- grep -E 'pattern1|pattern2' filename
- grep -e 'pattern1' -e 'pattern2' filename
- egrep 'pattern1|pattern2' filename
- grep AND 操作:
- grep -E 'pattern1.*pattern2' filename
- grep -E 'pattern1' | grep -E 'pattern2'
- grep NOT 操作
- grep -v 'pattern1' filename
[root@vm1 opt]# cat employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Raj Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy Manager Sales $6,000
OR
[root@vm1 opt]# grep 'Tech\|Manager' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Raj Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy Manager Sales $6,000
[root@vm1 opt]# grep -E 'Tech|Manager' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Raj Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy Manager Sales $6,000
[root@vm1 opt]# egrep 'Tech|Manager' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Raj Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy Manager Sales $6,000
[root@vm1 opt]# grep -e 'Tech' -e 'Manager' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Raj Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy Manager Sales $6,000
[root@vm1 opt]#
AND
[root@vm1 opt]# grep -E 'Manager.*Sales' employee.txt
100 Thomas Manager Sales $5,000
500 Randy Manager Sales $6,000
[root@vm1 opt]# grep -E 'Manager.*Sales|Sales.*Manager' employee.txt
100 Thomas Manager Sales $5,000
500 Randy Manager Sales $6,000
[root@vm1 opt]# grep 'Manager' employee.txt | grep 'Sales'
100 Thomas Manager Sales $5,000
500 Randy Manager Sales $6,000
NOT
grep -v
sed命令 —— 流处理编辑器
sed是行处理工具: 一次处理一行并且不改变文本内容的(除非重定向)
sed的处理过程: 正则选定文本 -> sed进行处理
sed的格式
- 命令行格式:sed [options] 'command' file(s)
- 脚本格式:sed -f scriptfile file(s) 命令行格式:
options(参数) : -e , -n
command(动作) : 行定位(正则) + sed命令(操作)
-p (打印相关行 记得跟-n配合,否则会多次打印 ) sed -n 'p' passwd
sed —— 行定位
定位一行: x ; /pattern/
打印第十行: sed -n '10p' passwd (可以使用nl passwd | sed -n '10p' 验证 ) 打印abrt行: sed -n '/abrt/p' passwd
定位几行:x,y ; /pattern/,y ; /pattern1/,/pattern2/ ; x,y!
打印10到20行 : nl passwd | sed -n '10,20p'
打印news所在行和mail所在行之间的行 : nl passwd | sed -n '/news/,/mail/p'
不打印news所在行和mooc所在行之间的行 : nl passwd | sed -n '/uucp/,/rpc/!p'
间隔行定位:first~step
[bozhu@l-xxxxxx.rd.xxxxxx.cn2 ~]$ nl passwd | sed -n '1,2p' -- 静默输出
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
[bozhu@l-xxxxxx.rd.xxxxxx.cn2 ~]$ nl passwd | sed '1,2p' -- 全量+操作行输出(p)
1 root:x:0:0:root:/root:/bin/bash
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
.......
[bozhu@l-xdriverm1.rd.beta.cn2 ~]$ nl passwd | sed -n '1~3p' -- 间隔行定位
1 root:x:0:0:root:/root:/bin/bash
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
10 operator:x:11:0:operator:/root:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
19 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
22 gluster:x:997:995:GlusterFS daemons:/var/run/gluster:/sbin/nologin
25 tjdep:x:30101:1001:tujia deploy user:/home/tjdep:/bin/bash
28 centos:x:50003:50003:Cloud User:/home/centos:/bin/bash
sed 参数
- -e或--expression 以选项中指定的script来处理输入的文本文件。
- -n或--quiet或--silent 仅显示script处理后的结果。 sed 操作命令
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!(全量替换,不是每行替换)
- d :删除,因为是删除啊,所以 d 后面通常不接任何;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
[bozhu@l-xxxx.xxxx.xxxx.cn2 ~]$ nl passwd | sed -e '1,2a \ zhangsan'
1 root:x:0:0:root:/root:/bin/bash
zhangsan
2 bin:x:1:1:bin:/bin:/sbin/nologin
zhangsan
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
-- '\' 为操作命令和额外参数的间隔符 例如行前加空格对其的情况
[bozhu@l-xxxx.xxxx.xxxx.xxxx ~]$ nl passwd | sed -e '1,2a \ zhangsan'
1 root:x:0:0:root:/root:/bin/bash
zhangsan
2 bin:x:1:1:bin:/bin:/sbin/nologin
zhangsan
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
[bozhu@l-xxxx.rd.xxxx.xxxx ~]$ nl passwd | sed -e '1,3d'
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
[bozhu@l-xxxx.xxxx.xxxx.xxxx ~]$ nl passwd | sed -e '1,2a \
zhangsan'
1 root:x:0:0:root:/root:/bin/bash
zhangsan
2 bin:x:1:1:bin:/bin:/sbin/nologin
zhangsan
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[zhubo@l-xxxx.xx.xx.x$ nl passwd | sed -e '2,5c \ zhangsan' -- 整段替换
1 root:x:0:0:root:/root:/bin/bash
zhangsan
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
[zhubo@l-xxxxx.xx.xx.xx ~]$ nl passwd | sed -e '/root/d' -- 正则匹配删除
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
-- 删除空行展示
[zhubo@l-xxxx.xx.xx.x$ sed '/^$/d' 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
字符串替换:s g (g全量替换)
sed 's/要被取代的字串正则/新的字串/g'
如要输出日志文件错误的IP部分:
[zhubo@l-pb-xxx.xx.cn1 /home/tomcat/logs]$ grep -iE 'ERROR' info
2018-12-08 00:13:53.113 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[66.225.251.170] loc failed
2018-12-08 00:17:42.551 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[172.105.240.169] loc failed
2018-12-08 00:32:47.807 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[171.97.148.2] loc failed
2018-12-08 00:35:18.650 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[122.155.45.101] loc failed
2018-12-08 00:36:21.390 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[95.134.248.53] loc failed
2018-12-08 00:38:27.578 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[27.1.208.41] loc failed
2018-12-08 00:46:38.847 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[182.68.246.99] loc failed
2018-12-08 00:47:22.042 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[65.74.21.178] loc failed
2018-12-08 00:55:38.512 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[37.142.242.98] loc failed
2018-12-08 01:07:41.353 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[94.54.26.13] loc failed
2018-12-08 01:13:36.722 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[107.77.226.13] loc failed
2018-12-08 01:24:37.047 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[212.58.120.105] loc failed
2018-12-08 01:25:14.341 ERROR c.t.t.l.core.impl.xxxxx.XXXXXXProvider - 请求失败,code=1,message=Internal Service Error:ip[154.160.14.41] loc failed
......
上面为日志文件的错误部分,接下来将对这部分文本进行处理,截取其中IP的部分输出:
[zhubo@l-xxxx-xxxxx.xx.xxx ~]$ grep -iE 'ERROR' info | sed -n 's/.*\[//p' | sed -n 's/\].*//p'
66.225.251.170
172.105.240.169
171.97.148.2
122.155.45.101
95.134.248.53
27.1.208.41
182.68.246.99
65.74.21.178
37.142.242.98
......
sed提供了一种将多个sed命令合并执行的方式:{} , 上面的两个sed命令可以合并执行,之间用分号间隔:
[bozhu@l-location-service1.rd.cn1 ~]$ grep -iE 'ERROR' info | sed '{s/.*\[//;s/\].*//}'
66.225.251.170
172.105.240.169
171.97.148.2
122.155.45.101
95.134.248.53
27.1.208.41
....
sed中&的使用,替换固定的字符串(对替换字符的补充) 如 sed 's/要被取代的字串正则/&新的字串/g'
其中&为被取代的字符串
[bozhu@l-location-service1.rd.cn1 ~]$ cat 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
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
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
bozhu :x:49012:1005::/home/bozhu:/bin/bash
[bozhu@l-location-service1.rd.cn1 ~]$ sed 's/^[a-z_-]\+/&_111/' passwd
root_111:x:0:0:root:/root:/bin/bash
bin_111:x:1:1:bin:/bin:/sbin/nologin
daemon_111:x:2:2:daemon:/sbin:/sbin/nologin
adm_111:x:3:4:adm:/var/adm:/sbin/nologin
lp_111:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync_111:x:5:0:sync:/sbin:/bin/sync
shutdown_111:x:6:0:shutdown:/sbin:/sbin/shutdown
halt_111:x:7:0:halt:/sbin:/sbin/halt
mail_111:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator_111:x:11:0:operator:/root:/sbin/nologin
games_111:x:12:100:games:/usr/games:/sbin/nologin
ftp_111:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody_111:x:99:99:Nobody:/:/sbin/nologin
注意了上面的+号前面加了转义字符,这是为什么呢,因为在sed中 问号、加号、圆括号、花括号和竖线没有特殊含义,就代表字符本身 如果要原本定义的实现特殊含义,需要用反斜杠(\)转义
大小写转换:(元字符\u \l \U \L 转换为大/小写字符)
将每行的第一个字符转换为大写
[bozhu@l-xxxx-xxxx.xxxx.xxxx ~]$ sed 's/^[a-z_-]\+/\u&/' 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
Adm:x:3:4:adm:/var/adm:/sbin/nologin
Lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Sync:x:5:0:sync:/sbin:/bin/sync
Shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
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
Games:x:12:100:games:/usr/games:/sbin/nologin
Ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
将文件夹下的txt文件的文件名转换为大写
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ ls *.txt
aa.txt info.txt qq.txt
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ ls *.txt | sed -e 's/^\w\+/\U&/'
AA.txt
INFO.txt
QQ.txt
替换命令中组() 的用法: \1 \2 \3 获取passwd中 USER UID 和 GID
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ cat 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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
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
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
[bozhu@l-location-service1.rd.cn1 ~]$ sed 's/\(^[a-z1-9._-]\+\):x:\([0-9]\+\):\([0-9]\+\).*/USER:\1 UID:\2 GID:\3/' passwd
USER:root UID:0 GID:0
USER:bin UID:1 GID:1
USER:daemon UID:2 GID:2
USER:adm UID:3 GID:4
USER:lp UID:4 GID:7
USER:sync UID:5 GID:0
USER:shutdown UID:6 GID:0
USER:halt UID:7 GID:0
USER:mail UID:8 GID:12
USER:operator UID:11 GID:0
USER:games UID:12 GID:100
USER:ftp UID:14 GID:50
USER:nobody UID:99 GID:99
输出eth0网卡的IP地址信息:
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.10.10.10 netmask 255.255.254.0 broadcast 172.31.31.255
inet6 fe80::a830:5bff:fe3a:4cb4 prefixlen 64 scopeid 0x20<link>
ether aa:30:5b:3a:4c:b4 txqueuelen 1000 (Ethernet)
RX packets 201374082 bytes 54478001978 (50.7 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 148223759 bytes 26295570488 (24.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ ifconfig eth0 |grep -E 'inet ' | sed 's/inet \([0-9.]\+\) .*/\1/'
172.10.10.10
-r : 复制指定文件插入到匹配行 sed 'pattern r resourcefile' target 读取resourcefile中的内容 插入到target的pattern的匹配行中进行展示 -w : 复制匹配行拷贝到指定文件里 sed 'pattern w targetfile' sourcefile 将sourcefile中指定pattern行 ,覆写入targetfile中
q 提前退出sed
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ nl passwd |sed '5q'
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
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$ nl passwd |sed '/mail/q'
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
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[bozhu@l-xxxxx-xxxxx.xxxxx.xxxxx ~]$
awk命令 —— 文本与数据处理工具(可编程/统计 制表 及更多功能)
awk的处理方式
- awk一次处理一行内容
- awk可以对每行可以切片处理
awk '{print $1}' // 输出首个单词
awk格式
- 命令行格式 $awk [options] 'command' file(s)
- 脚本格式 $awk f awk-script-file file(s)
命令行格式
- 基本格式
- 扩展格式
基本格式
$awk [options] 'command' file(s) //awk基本格式主要包括两部分,一是options参数 二是command 命令
command : pattern {awk 操作命令} // command命令包括两部分,一是 pattern(模式) 二是 操作命令
pattern : 正则表达式;逻辑判断式 . // 模式可以由 正则表达式和逻辑判断式组成
command操作命令:由大括号括起,它不像sed中只使用简单的命令,也可以使用内置的函数,也可以使用控制指令if else while等等
内置函数:print() prinf() getline....
控制指令:if(){...}else{...} ; while(){...}
awk内置变量及参数应用
- awk内置变量1
$0 : 整个当前行
$1 : 每行第一个字段
$2 : 每行第二个字段 - awk内置参数1:分隔符 -F
options : -F file-separator(默认为空格)
[root@vm1 ~]# awk -F ':' '{print $1 $3}' passwd // 默认print的输出 username 与uid 是连在一起的
root0
bin1
daemon2
adm3
lp4
sync5
shutdown6
halt7
mail8
[root@vm1 ~]# awk -F ':' '{print $1,$3}' passwd // 如果想让他们分割显示可以中间加逗号, 逗号的分割字符是空格
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
[root@vm1 ~]# awk -F ':' '{print $1"\t "$3}' passwd // 也可以在print语句的输出中间加入其它字符串
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
[root@vm1 ~]# awk -F ':' '{print "USER:"$1"\t ""UID:"$3}' passwd
USER:root UID:0
USER:bin UID:1
USER:daemon UID:2
USER:adm UID:3
USER:lp UID:4
USER:sync UID:5
USER:shutdown UID:6
USER:halt UID:7
USER:mail UID:8
- awk内置变量2
NR:每行的记录行号 Number Of Record NF:每行的字段总数 Number Of Field FILENAME:正在处理的文件名
[root@vm1 ~]# awk -F ':' '{print NR,NF}' passwd // 分别打印行号和字段总数
1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
9 7
案例使用
案例一:显示/etc/passwd 每行的行号,每行列数和对应行的用户名(print,printf)
[root@vm1 ~]# awk -F ':' '{print "LINE: "NR,"COL: "NF,"USER:"$1}' passwd
LINE: 1 COL: 7 USER:root
LINE: 2 COL: 7 USER:bin
LINE: 3 COL: 7 USER:daemon
LINE: 4 COL: 7 USER:adm
LINE: 5 COL: 7 USER:lp
LINE: 6 COL: 7 USER:sync
LINE: 7 COL: 7 USER:shutdown
LINE: 8 COL: 7 USER:halt
LINE: 9 COL: 7 USER:mail
[root@vm1 ~]# awk -F ':' '{printf("LINE:%3s COL:%s USER:%s\n" , NR,NF,$1)}' passwd // printf 函数式输出
LINE: 1 COL:7 USER:root
LINE: 2 COL:7 USER:bin
LINE: 3 COL:7 USER:daemon
LINE: 4 COL:7 USER:adm
LINE: 5 COL:7 USER:lp
LINE: 6 COL:7 USER:sync
LINE: 7 COL:7 USER:shutdown
LINE: 8 COL:7 USER:halt
LINE: 9 COL:7 USER:mail
案例二:显示passwd中用户ID大于100的行号和用户名(if...else...)
[root@vm1 ~]# awk -F ':' '{if($3>100) print "Line: "NR , "USER: "$1}' passwd
Line: 17 USER: usbmuxd
Line: 19 USER: rtkit
Line: 20 USER: avahi-autoipd
Line: 22 USER: abrt
Line: 24 USER: nfsnobody
Line: 28 USER: saslauth
Line: 31 USER: pulse
Line: 34 USER: zhubo
找出文件中Manager的薪水,并打印
[root@vm1 opt]# cat employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Raj Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy Manager Sales $6,000
[root@vm1 opt]# sed -n '/Manager/p' employee.txt | awk '{print $5}'
$5,000
$9,500
$6,000
[root@vm1 opt]# awk '/Manager/{print $5}' employee.txt
$5,000
$9,500
$6,000
[root@vm1 opt]#
awk逻辑判断式
~ !~ : 匹配正则表达式
== , != , < , > : 判断逻辑表达式
[root@vm1 ~]# awk -F ':' '$1~/^r.*/{print $1}' passwd
root
rpc
rtkit
rpcuser
[root@vm1 ~]# awk -F ':' '$1!~/^r.*/{print $1}' passwd // 取反
bin
daemon
adm
lp
sync
shutdown
[root@vm1 ~]# awk -F ':' '$3>100{print $1,$3}' passwd // uid > 100
usbmuxd 113
rtkit 499
avahi-autoipd 170
abrt 173
nfsnobody 65534
saslauth 498
pulse 497
zhubo 500
扩展格式
$ awk [options] 'commands' file(s) command2扩展 : BEGIN{print "start"}pattern{commands}END{print "end"} BEGIN是在循环之前执行 END是在循环之后执行不参与循环得过程
案例一:显示passwd中每行行号,每行的列数,对应行的用户名
[root@vm1 ~]# awk -F ':' 'BEGIN{print "Line Col User"}{print NR,NF,$1}END{print "------"FILENAME"-----"}' passwd
Line Col User
1 7 root
2 7 bin
3 7 daemon
4 7 adm
5 7 lp
6 7 sync
7 7 shutdown
8 7 halt
9 7 mail
10 7 uucp
11 7 operator
12 7 games
------passwd-----
案例一: 统计当前文件夹下的文件/文件夹占用大小
[root@vm1 ~]# ls -l
总用量 104
-rw-------. 1 root root 1609 7月 7 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 46478 7月 7 18:41 install.log
-rw-r--r--. 1 root root 10033 7月 7 18:39 install.log.syslog
-rw-r--r--. 1 root root 1620 12月 10 21:19 passwd
drwxr-xr-x. 2 root root 4096 7月 7 10:53 公共的
drwxr-xr-x. 2 root root 4096 7月 7 10:53 模板
drwxr-xr-x. 2 root root 4096 7月 7 10:53 视频
drwxr-xr-x. 2 root root 4096 7月 7 10:53 图片
drwxr-xr-x. 2 root root 4096 7月 7 10:53 文档
drwxr-xr-x. 2 root root 4096 7月 7 10:53 下载
drwxr-xr-x. 2 root root 4096 7月 7 10:53 音乐
drwxr-xr-x. 2 root root 4096 7月 7 10:53 桌面
[root@vm1 ~]# ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is "size}'
size is 92508
[root@vm1 ~]# ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is "size/1024"K"}'
size is 90.3398K
案例二:统计显示passwd的账户总人数
[root@vm1 ~]# awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print count}' passwd //排除空行
34
统计UID>100的账户总人数
[root@vm1 ~]# awk -F ':' 'BEGIN{count=0}{if ($3>100) name[count++]=$1}END{for(i=0;i<count;i++) print i,name[i]}' passwd
0 usbmuxd
1 rtkit
2 avahi-autoipd
3 abrt
4 nfsnobody
5 saslauth
6 pulse
7 zhubo
案例三: 统计netstat -amp 状态下 LISTEN和CONNECTED的连接状态
[root@vm1 ~]# netstat -anp
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ] STREAM LISTENING 15997 2268/gnome-session @/tmp/.ICE-unix/2268
unix 2 [ ] STREAM LISTENING 15723 2181/Xorg /tmp/.X11-unix/X0
unix 2 [ ] STREAM LISTENING 15998 2268/gnome-session /tmp/.ICE-unix/2268
unix 2 [ ] STREAM LISTENING 16065 2275/gconfd-2 /tmp/orbit-gdm/linc-8e3-0-3681d67c590fa
unix 2 [ ] STREAM LISTENING 16139 2268/gnome-session /tmp/orbit-gdm/linc-8dc-0-756f0d535b355
unix 2 [ ] STREAM LISTENING 16240 2295/gnome-settings /tmp/orbit-gdm/linc-8f7-0-2d979a559d723
unix 2 [ ] STREAM LISTENING 16312 2297/bonobo-activat /tmp/orbit-gdm/linc-8f9-0-3e19569c5dda2
unix 3 [ ] STREAM CONNECTED 16738 1622/dbus-daemon /var/run/dbus/system_bus_socket
unix 3 [ ] STREAM CONNECTED 16737 2317/polkitd
unix 3 [ ] STREAM CONNECTED 16653 1622/dbus-daemon /var/run/dbus/system_bus_socket
unix 3 [ ] STREAM CONNECTED 16652 2311/polkit-gnome-a
unix 3 [ ] STREAM CONNECTED 16747 2311/polkit-gnome-a /tmp/orbit-gdm/linc-907-0-116ec6d6f190f
unix 3 [ ] STREAM CONNECTED 16649 2294/at-spi-registr
unix 3 [ ] STREAM CONNECTED 16646 2294/at-spi-registr /tmp/orbit-gdm/linc-8f6-0-3a2c08ec5e139
unix 3 [ ] STREAM CONNECTED 16645 2311/polkit-gnome-a
unix 3 [ ] STREAM CONNECTED 16642 2181/Xorg @/tmp/.X11-unix/X0
unix 3 [ ] STREAM CONNECTED 16641 2311/polkit-gnome-a
unix 3 [ ] STREAM CONNECTED 16633 2309/gnome-power-ma /
[root@vm1 ~]# netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for(i in sum) print i , sum[i]}'
CONNECTED 226
LISTEN 12