内容简介:上面是对单个字符的重复,如果对字符串的重复可以使用() 其中,括号使用在字符串中时加上\(se)* 如 : grep '\(se\)*' passwd(se)+ 如 : grep '\(se\)\+' passwd
文本处理工具 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
公众号
以上所述就是小编给大家介绍的《文本处理工具 grep awk sed完全解读 原 荐》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Inside Larry's and Sergey's Brain
Richard Brandt / Portfolio / 17 Sep 2009 / USD 24.95
You’ve used their products. You’ve heard about their skyrocketing wealth and “don’t be evil” business motto. But how much do you really know about Google’s founders, Larry Page and Sergey Brin? Inside......一起来看看 《Inside Larry's and Sergey's Brain》 这本书的介绍吧!