文本处理工具下——分析文本的工具

一分析文本的工具

文本数据统计: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

猜你喜欢

转载自www.cnblogs.com/wang618/p/11063855.html