一分析文本的工具
文本数据统计:wc
整理文本:sort
比较文件:diff 和patch
(一)收集文本统计数据——wc
计数单词总数、行总数、字节总数和字符总数,可以对文件或STDIN 中的数据运行。
常用选项
-l 只计数行数
-w 只计数单词总数
-c 只计数字节总数
-m 只计数字符总数
-L 显示文件中最长行的长度
(1)显示单词总数、行总数、字节总数
[root@centos72 ~]# wc /app/passwd
19 27 841 /app/passwd
[root@centos72 ~]# wc /app/f1
4 4 12 /app/f1
[root@centos72 ~]# ll /app/passwd
-rw-r--r--. 1 root root 841 May 7 18:00 /app/passwd
[root@centos72 ~]# ll /app/f1
-rw-r--r--. 1 root root 12 May 7 20:35 /app/f1
(2)wc结合管道
wc和head一样是交互式命令,读取键盘输入,那么就可以结合管道
只要是空格隔开的都是单词
[root@centos72 ~]# w | wc
5 41 336
[root@centos72 ~]# w
20:53:56 up 8:33, 3 users, load average: 0.16, 0.05, 0.06
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 13Jan19 8:12m 0.28s 0.28s -bash
root pts/0 192.168.137.1 15:13 2:39m 0.10s 0.10s -bash
root pts/1 192.168.137.1 12:41 4.00s 2.00s 0.02s w
[root@centos72 ~]# echo 0 1 2 3 > /app/f4
[root@centos72 ~]# /app/f4 | wc
-bash: /app/f4: Permission denied
0 0 0
[root@centos72 ~]# cat /app/f4 | wc
1 4 8
[root@centos72 ~]# cat /app/f4
0 1 2 3
[root@centos72 ~]# echo 0 1 2 3 > /app/f5
[root@centos72 ~]# cat /app/f5
0 1 2 3
[root@centos72 ~]# cat /app/f5 | wc
1 4 8
(3)单独统计行,单词,字节,字符总数
[root@centos72 ~]# cat /app/passwd | wc -l
19
[root@centos72 ~]# cat /app/passwd | wc -w
27
[root@centos72 ~]# cat /app/passwd | wc -c
841
[root@centos72 ~]# cat /app/passwd | wc -m
841
注意字节和字符不一样,字节是磁盘上占用的空间。
一个汉字是一个字符,但是是好几个字节
字节是4个,字符是2个
[root@centos72 ~]# echo 我 > f1
[root@centos72 ~]#wc f1
1 1 4 f1
[root@centos72 ~]# wc -m f1
2 f1
使用二进制查看
[root@centos72 ~]# hexdump -C f2
00000000 e4 bd a0 0a |....|
00000004
查看多少人登录系统
[root@centos72 ~]# who
root tty1 2019-01-13 00:35
root pts/0 2019-05-07 15:13 (192.168.137.1)
root pts/1 2019-05-07 12:41 (192.168.137.1)
[root@centos72 ~]# who | wc -l
3
(4)-L 显示文件中最长行的长度
[root@centos72 ~]# who
root tty1 2019-01-13 00:35
root pts/0 2019-05-07 15:13 (192.168.137.1)
root pts/1 2019-05-07 12:41 (192.168.137.1)
[root@centos72 ~]# who | wc -l
3
[root@centos72 ~]# who | wc -L
54
(二)文本排序sort
把整理过的文本显示在STDOUT ,不改变原始文件
sort [options] file(s)
常用选项
-r 执行反方向(由上至下)整理
-n 执行按数字大小整理
-f 选项忽略(fold )字符串中的字符大小写
-u 选项(独特,unique )删除输出中的重复行
-t c 选项使用c 做为字段界定符
-k X 选项按照使用c 字符分隔的X 列来整理能够使用多次
(1)默认是读取键盘输入的,按照字符排序
分隔符是冒号,-k表示列
[root@centos72 ~]# sort -t: -k3 /app/passwd
root:x:0:0:root:/root:/bin/bash
wang:x:1000:1000:wang:/home/wang:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/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
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
(2)-n 执行按数字大小整理
[root@centos72 ~]# sort -n -t: -k3 /app/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
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
wang:x:1000:1000:wang:/home/wang:/bin/bash
(3)-r 执行反方向(由上至下)整理
[root@centos72 ~]# sort -nr -t: -k3 /app/passwd
wang:x:1000:1000:wang:/home/wang:/bin/bash
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
[root@centos72 ~]# sort -t: -k1 /app/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
wang:x:1000:1000:wang:/home/wang:/bin/bash
显示用户名和ID,并且按照ID的大小排序
[root@centos72 ~]# cut -d: -f1,3 /app/passwd | sort -nr -t: -k2
wang:1000
polkitd:999
systemd-network:192
nobody:99
postfix:89
dbus:81
sshd:74
ftp:14
games:12
operator:11
mail:8
halt:7
shutdown:6
sync:5
lp:4
adm:3
daemon:2
bin:1
root:0
创建一个文件
[root@centos72 ~]# cat > f3
1
2
3
2
4
5
6
2
3
5
^C^C
[root@centos72 ~]# cat f3
1
2
3
2
4
5
6
2
3
5
默认按照字符顺序排序的
[root@centos72 ~]# sort f3
1
2
2
2
3
3
4
5
5
6
(4) -u 选项(独特,unique )删除输出中的重复行
删除重复的数字
[root@centos72 ~]# sort -u f3
1
2
3
4
5
6
[root@centos72 ~]# echo 11 >> f3
[root@centos72 ~]# echo 22 >> f3
[root@centos72 ~]# echo 33 >> f3
[root@centos72 ~]# cat f3
1
2
3
2
4
5
6
2
3
5
11
22
33
[root@centos72 ~]# sort -u f3
1
11
2
22
3
33
4
5
6
按照数字排序
[root@centos72 ~]# sort -nu f3
1
2
3
4
5
6
11
22
33
[root@centos72 ~]# sort -un f3
1
2
3
4
5
6
11
22
33
(三)uniq
uniq 命令:从输入中删除前后相接的重复的行
uniq [OPTION]... [FILE]...
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
连续且完全相同方为重复
常和sort 命令一起配合使用:sort userlist.txt | uniq -c
创建文件
(1)从输入中删除前后相接的重复的行
[root@centos72 ~]# cat > f4
a
b
a
a
bb
bb
c
bb
cc
cc
^C
[root@centos72 ~]# cat f4
a
b
a
a
bb
bb
c
bb
cc
cc
[root@centos72 ~]# uniq f4
a
b
a
bb
c
bb
cc
(2)-c: 显示每行重复出现的次数
[root@centos72 ~]# uniq -c f4
1 a
1 b
2 a
2 bb
1 c
1 bb
2 cc
(3)-u: 仅显示不曾重复的行
[root@centos72 ~]# uniq -u f4
a
b
c
bb
(4)-d: 仅显示重复过的行
[root@centos72 ~]# uniq -d f4
a
bb
cc
(5)使用管道传输
空格作为分隔符
[root@centos72 ~]# cut -d" " -f1 /var/log/httpd/access_log
192.168.137.1
192.168.137.1
192.168.137.1
192.168.137.1
192.168.137.1
192.168.137.1
192.168.137.1
192.168.137.1
192.168.137.1
192.168.137.1
[root@centos72 ~]# cut -d" " -f1 /var/log/httpd/access_log | uniq
192.168.137.1
示例1:取出访问日志里面访问量最大或者前三的IP地址,并且从大到小排序
下面要启动服务才可以,首先要转到快照。
如果没有做快照那么就只能把文件保存到电脑上
[root@centos72 ~]# cut -d" " -f1 /var/log/httpd/access_log | sort -n | uniq -c | sort -nr | head | tr -s ' ' | cut -d " " -f3
192.168.137.1
远程传输一个文件
[root@centos72 ~]# rz
[root@centos72 ~]# ls
aaa aa.txt access_log anaconda-ks.cfg f1 f2 f3 f4
[root@centos72 ~]# ll -ht
total 14M
-rw-r--r--. 1 root root 25 May 7 22:12 f4
-rw-r--r--. 1 root root 30 May 7 22:04 f3
-rw-r--r--. 1 root root 4 May 7 21:08 f2
-rw-r--r--. 1 root root 4 May 7 21:03 f1
-rw-r--r--. 1 root root 27 May 7 19:11 aa.txt
-rw-r--r--. 1 root root 9 May 7 13:28 aaa
-rw-------. 1 root root 1.6K Jan 13 00:22 anaconda-ks.cfg
-rw-r--r--. 1 root root 14M Dec 1 15:45 access_log
[root@centos72 ~]# ll -hS
total 14M
-rw-r--r--. 1 root root 14M Dec 1 15:45 access_log
-rw-------. 1 root root 1.6K Jan 13 00:22 anaconda-ks.cfg
-rw-r--r--. 1 root root 30 May 7 22:04 f3
-rw-r--r--. 1 root root 27 May 7 19:11 aa.txt
-rw-r--r--. 1 root root 25 May 7 22:12 f4
-rw-r--r--. 1 root root 9 May 7 13:28 aaa
-rw-r--r--. 1 root root 4 May 7 21:03 f1
-rw-r--r--. 1 root root 4 May 7 21:08 f2
[root@centos72 ~]# cut -d" " -f1 access_log | sort -n | uniq -c | sort -nr
159091 172.18.56.3
4004 192.168.27.6
24 172.18.0.100
如果访问的主机数量不超过10个,那么就可以不加head
[root@centos72 ~]# cut -d" " -f1 access_log | sort -n | uniq -c | sort -nr | head
159091 172.18.56.3
4004 192.168.27.6
24 172.18.0.100
删除多余的空格
[root@centos72 ~]# cut -d" " -f1 access_log | sort -n | uniq -c | sort -nr | head | tr -s ' '
159091 172.18.56.3
4004 192.168.27.6
24 172.18.0.100
以空格为分隔符,取第3个字段
[root@centos72 ~]# cut -d" " -f1 access_log | sort -n | uniq -c | sort -nr | head | tr -s ' ' | cut -d " " -f3
192.168.56.3
192.168.27.6
192.168.0.100
示例2:统计连接数
ss -nt 查询并发连接的远程IP最多的前三个IP
[root@centos72 ~]# ss -tn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 192.168.137.72:22 192.168.137.1:57568
ESTAB 0 0 192.168.137.72:22 192.168.137.1:58228
删除多余的空格,并且分割符替换为冒号
[root@centos72 ~]# ss -tn | grep ESTAB | tr -s ' ' :
ESTAB:0:52:192.168.137.72:22:192.168.137.1:57568:
ESTAB:0:0:192.168.137.72:22:192.168.137.1:58228:
以冒号作为分隔符,取第6个字段的结果
[root@centos72 ~]# ss -tn | grep ESTAB | tr -s ' ' : | cut -d: -f6
192.168.137.1
192.168.137.1
按照数字进行排序
[root@centos72 ~]# ss -tn | grep ESTAB | tr -s ' ' : | cut -d: -f6 | sort -n
192.168.137.1
192.168.137.1
[root@centos72 ~]# ss -tn | grep ESTAB | tr -s ' ' : | cut -d: -f6 | sort -n | uniq
192.168.137.1
显示每行重复出现的次数
[root@centos72 ~]# ss -tn | grep ESTAB | tr -s ' ' : | cut -d: -f6 | sort -n | uniq -c
2 192.168.137.1