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


    一分析文本的工具

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


    作者:wang618
    出处:https://www.cnblogs.com/wang618/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    nodejs微服务健康检查方案
    RabbitMQ inequivalent arg 'durable' for exchange 'csExchange' in vhost '/': received
    python 虚拟环境
    gulp-babel使用
    node-schedule定时任务
    微信小程序分包(附微信小程序开发学习手册)
    抖音、腾讯、京东、阿里等大厂性能优化方案总结(含项目实战分析及视频)
    微信小程序绘制二维码(附微信小程序开发学习手册)
    【纯干货分享】拒绝卡顿,揭秘盒马鲜生 APP Android 短视频秒播优化方案
    碰壁五次!我闭关28天啃完这些书,再战拿下腾讯,爱奇艺,小红书,快手等10家大厂!化身offer收割机!
  • 原文地址:https://www.cnblogs.com/wang618/p/11063855.html
Copyright © 2020-2023  润新知