字符处理命令(sort、uniq、cut、sed、awk、wc)
字符处理命令
排序命令:sort 选项 -t(指定分隔符) -k(指定某一列) -n(以阿拉伯数字排序) -r(逆序排列)
ps:(默认sort以第一列排序)
示例:按数字排序IP的访问次数
[root@LiSong ~]# cat ip.txt
192.168.3.1 00:0F:AF:81:19:1F
192.168.3.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.2.20 00:0F:AF:85:55:DE
192.168.2.21 00:0F:AF:85:6C:09
192.168.2.22 00:0F:AF:85:5C:41
192.168.0.151 00:0F:AF:85:6C:F6
192.168.0.152 00:0F:AF:83:1F:65
192.168.0.153 00:0F:AF:85:70:03
192.168.1.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.1.12 00:30:15:A2:3A:A1
192.168.1.1 00:0F:AF:81:19:1F
192.168.2.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.2.20 00:0F:AF:85:55:DE
192.168.1.21 00:0F:AF:85:6C:09
192.168.2.22 00:0F:AF:85:5C:41
192.168.0.151 00:0F:AF:85:6C:F6
192.168.1.152 00:0F:AF:83:1F:65
192.168.0.153 00:0F:AF:85:70:03
192.168.3.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.3.12 00:30:15:A2:3A:A1
答:[root@LiSong ~]# sort -t "." -k3.1,3.1 -k4.1,4.3 -n ip.txt
192.168.0.151 00:0F:AF:85:6C:F6
192.168.0.151 00:0F:AF:85:6C:F6
192.168.0.152 00:0F:AF:83:1F:65
192.168.0.153 00:0F:AF:85:70:03
192.168.0.153 00:0F:AF:85:70:03
192.168.1.1 00:0F:AF:81:19:1F
192.168.1.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.1.11 00:30:15:A3:23:B7
192.168.1.12 00:30:15:A2:3A:A1
192.168.1.21 00:0F:AF:85:6C:09
192.168.1.152 00:0F:AF:83:1F:65
192.168.2.2 00:0F:AF:85:6C:25
192.168.2.20 00:0F:AF:85:55:DE
192.168.2.20 00:0F:AF:85:55:DE
192.168.2.21 00:0F:AF:85:6C:09
192.168.2.22 00:0F:AF:85:5C:41
192.168.2.22 00:0F:AF:85:5C:41
192.168.3.1 00:0F:AF:81:19:1F
192.168.3.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.3.3 00:0F:AF:85:70:42
192.168.3.10 00:30:15:A2:3B:B6
192.168.3.12 00:30:15:A2:3A:A1
去重命令:uniq 选项 -c(统计出现次数)
[root@LiSong ~]# cat yunxi.txt
abc
123
abc
123
答:[root@LiSong ~]# sort yunxi.txt | uniq -c
2 123
2 abc
ps:(必须先排序才能统计次数 | 的意思是将前者命令的输出交给后者命令的输入)
忽略:(awk '{print $1}' docs.xuliangwei.log | sort | uniq -c | sort -nr | head -10)
495 114.92.159.100
446 123.207.173.97
347 139.226.173.12
159 139.226.173.216
101 139.226.172.91
75 139.226.172.150
54 45.124.44.152
54 101.224.238.107
52 47.101.50.252
41 101.81.200.114
字符截取命令cut 选项 -d(指定分隔符) -f(指定某一列)
awk 选项 -F(指定分隔符)
sed 选项 -i(修改文件) -n(取消打印默认输出) -r(支持正则表达式)
示例:echo "Im lisong, is QQ 67204889" >file.txt 取出lisong以及67204889
答:
# cut -d " " -f 2,5 file.txt | awk -F "," '{print $1,$2}'
# awk '{print $2,$5}' file.txt |awk -F "," '{print $1,$2}'
# awk -F '[, ]' '{print $2,$6}' file.txt
# awk -F '[, ]+' '{print $2,$5}' file.txt #参考
# cut -d " " -f 2,5 file.txt|sed 's#,##g'
取列:cut awk
替换:sed
取行:grep awk
#实现上述题目几种思路
# cut -d " " -f2,5 file.txt
# cut -d " " -f2,5 file.txt |sed 's#,##g'
# sed 's#,# #g' file.txt | awk -F " " '{print $2 " " $5}'
# awk '{print $2,$5}' file.txt |awk -F ',' '{print $1,$2}'
# awk -F "[, ]" '{print $2,$6}' file.txt
# awk -F '[, ]+' '{print $2,$5}' file.txt
过滤,取行
# awk '/root/' /etc/passwd
# awk '/^root/' /etc/passwd
统计行号:wc 选项 -c(显示文件字节) -l(显示文件行数) -w(显示文件单词数)
# wc -l /etc/passwd #统计/etc/passwd文件有多少行
#显示某文件的最后一行并显示行号 -n(显示行号)
# grep -n "." /etc/services | tail -1
# cat -n /etc/services | tail -1
习题:过滤出/etc/passwd以nologin结尾的.并统计有多少行
# grep "nologin$" /etc/passwd | wc -l
习题:使用ifconfig获取当前的IP地址,使用sed\awk\grep取当前服务器的ens32的IP地址
#ifconfig ens32 | awk 'NR==2 {print $2}'
# ifconfig ens32 | grep "inet "|cut -d " " -f 10
# ifconfig ens32 | grep "inet "|awk '{print $2}'
# ifconfig ens32 | awk '/inet /'|awk '{print $2}'
awk取行
# ifconfig ens32|awk 'NR==2 {print $2}' #NR代表的是行号,NR==2 代表要取输出结果的第二行
sed取行
# ifconfig ens32|sed -n '2p'|awk '{print $2}'
2.模拟演练
3.真的修改
# sed 's#^SELINUX=.*#SELINUX=disabled#g' /etc/sysconfig/selinux
# sed -i 's#^SELINUX=.*#SELINUX=disabled#g' /etc/sysconfig/selinux -i(修改文件)
# awk '/^root/' /etc/passwd|awk -F ":" '{print $7":"$2":"$3":"$4":"$5":"$6":"$1}'
# awk -F ":" '/^root/ {print $7":"$2":"$3":"$4":"$5":"$6":"$1}' /etc/passwd
# sed -n '1p' /etc/passwd|sed -r 's#(root)(.*)(/bin/bash)#\3\2\1#g'