美文网首页Python全栈工程师
4.2 Linux文本处理工具

4.2 Linux文本处理工具

作者: BeautifulSoulpy | 来源:发表于2019-07-01 20:36 被阅读2次

    命运要你成长的时候,总会安排一些让你不顺心的人或事刺激你;
    等你的身体出了什么毛病,你就会意识到什么烦心事都是屁,都是吃饱了撑的,都是闲的,健康活着比什么都重要。


    命令目录:

    1. [文件查看]: [cat] [tac] [rev] [more][less]
    2. [按行截取]: [head] [tail]
    3. [转化内容]: [tr]
    4. [按列操作]: [cut] [paste]
    5. [分析文本]: [wc] [sort] [uniq] [diff、patch]
    6. [按关键字过滤]: [grep]

    1. 文件查看

    cat

    查看文件,从第一行到最后一行全部显示。

    参数:

    • -E: 显示行结束符$
    • -A:显示不可打印字符,通常查看脚本是否有多加空格tab回车之类的。
    • -n:对显示出的每一行进行编号
    • -s:显示行号,压缩连续的空行,只显示一行空行
    • -b:空行不加行号,等同于nl命令

    示例:

    [root❄centos7 app]☭ cat catfile
    AAA BBB
    CCC DDD
    EEE
    
    GGG
    
    HHH
    [root❄centos7 app]☭ cat -A catfile 
    AAA^IBBB$
    CCC DDD$
    EEE$
    $
    GGG$
    $
    $
    HHH$
    [root❄centos7 app]☭ cat -n catfile 
         1  AAA BBB
         2  CCC DDD
         3  EEE
         4  
         5  GGG
         6  
         7  
         8  HHH
    [root❄centos7 app]☭ cat -b catfile
         1  AAA BBB
         2  CCC DDD
         3  EEE
    
         4  GGG
    
    
         5  HHH
    [root❄centos7 app]☭ cat -s catfile
    AAA BBB
    CCC DDD
    EEE
    
    GGG
    
    HHH
    

    tac

    从后往前显示文件,和cat相反。
    示例:

    [root❄centos7 app]☭ tac catfile
    HHH
    GGG
    EEE
    CCC DDD
    AAA BBB
    

    rev

    reverse lines水平反转每一行里的字母。

    示例1,水平翻转文件:
    [root❄centos7 app]☭ rev catfile 
    BBB AAA
    DDD CCC
    EEE
    GGG
    HHH
    
    示例2,倒序+水平翻转文件:
    [root❄centos7 app]☭ tac catfile | rev
    HHH
    GGG
    EEE
    DDD CCC
    BBB AAA
    

    more

    分页显示,显示到最后会退出。

    空格或者f下一页
    b上一页(管道后跟more无法上一页)

    less

    分页显示,显示到最后也不会退出,要按q退出;
    翻屏操作:

    键盘按键 效果
    空格键 向下滚动一屏
    b 向上滚动一屏
    j 向下移动一行
    k或回车 向上移动一行
    gg 跳转至第一行
    5g 跳转到第5行
    G 跳转到最后一行
    q 退出

    文本搜索:

    键盘按键 效果
    /keyword 向下查找,不区分大小写
    ?keyword 向上查找,不区分大小写
    n 查找下一个,与查找方向相同
    N 查找上一个,与查找方向相反

    2. 按行截取

    head

    取文件头部的行,默认头10行。

    参数:

    • -c NUM:显示几个字符
    • -n NUM:显示几行
    
    # 取随机数里,数字或字母的字符,取前20个字符,可以用来做随机密码。
    cat /dev/urandom | tr -dc "0-9a-zA-Z" | head -c 20
    

    tail

    显示文件尾部的行,默认最后10行。

    参数:
    -c NUM:只显示倒数几个字符。
    -n NUM:示倒数几行。
    -f:follow,跟踪这个文件的变动,用来看日志比较多

    例子:
    tail -n0 -f /var/log/messages &`
    

    -n0只显示新增加的内容,命令最后加一个&,表示放在后台运行,可以去运行其他命令不受影响。当日志变动的时候,会在前台打印出一条,按回车可以继续运行其他命令。

    3. 转化内容

    tr

    tr [OPTION]... SET1 [SET2]
    把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符

    参数:

    • tr SET1 SET2 < /path/from/somefile`对位转化SET1中的字符为SET2中的字符
    • tr -d SET1 < /path/from/somefile`删除指定集合里出现的字符
    • tr -s "\n" /path/from/somefile`把指定的连续的字符以一个字符表示,压缩。
    • tr -c Complement ,取字符集的补集,通常与其他参数结合使用,例如`-dc
    [root❄centos7 ~]☭ tr 'a-z' 'A-Z'
    aabbcc33
    AABBCC33
    ^C
    
    [root❄centos7 ~]☭ tr 'a-z' 'A-Z' </etc/issue
    \S
    KERNEL \R ON AN \M
    
    [root❄centos7 ~]☭ tr 'a-z' 'A-Z' < /etc/issue > /app/issue2
    [root❄centos7 ~]☭ cat /app/issue2
    \S
    KERNEL \R ON AN \M
    

    tips:如果是输入后再输出到同一个文件,就会清空这个文件,所以最好不要这么用,下面是一个错误示范:

    [root❄centos7 ~]☭ cd /app/
    [root❄centos7 app]☭ cp issue2 issue3
    [root❄centos7 app]☭ tr 'a-z' 'A-Z' < issue3 >issue3
    [root❄centos7 app]☭ cat issue3
    [root❄centos7 app]☭
    

    追加是可以的,在原有文件基础上再追加一段:

    [root❄centos7 app]☭ cat issue2
    \S
    KERNEL \R ON AN \M
    
    [root❄centos7 app]☭ tr 'A-Z' 'a-z' < issue2 >> issue2
    [root❄centos7 app]☭ cat issue2
    \S
    KERNEL \R ON AN \M
    
    \s
    kernel \r on an \m
    

    dc结合使用:

    [root❄centos7 app]☭ echo {a..z} >f1
    [root❄centos7 app]☭ cat f1
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    
    [root❄centos7 app]☭ tr -d 'f-n' <f1
    a b c d e          o p q r s t u v w x y z
    
    [root❄centos7 app]☭ cat f1
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    
    [root❄centos7 app]☭ tr -dc 'f-n' < f1
    fghijklmn[root❄centos7 app]☭
    

    4. 按列操作

    cut

    cut可以实现分割每一行,并且指定输出列的字段。

    • -d DELIMITER:指定分隔符(delimiter)
    • -f FIELDS:取指定列字段(fileds)

    示例1:

    # 以冒号作为分隔符,取1到3、7的字段
    cut -d: -f1-3,7 /etc/passwd
    
    # 结果
    root:x:0:/bin/bash
    LongDream:x:1000:/bin/bash
    yu:x:1001:/bin/bash
    alice:x:1002:/bin/bash
    tom:x:1003:/bin/bash
    

    示例2:

    # 取磁盘利用率,先tr压缩空格为一个空格,然后以空格作为分隔符,取第五个字段
    df |tr -s " "| cut -d" " -f5
    # 结果
    Use%
    5%
    0%
    0%
    1%
    0%
    1%
    22%
    0%
    

    paste

    把多个文件的多行进行合并,逐行进行合并。

    参数:
    -d指定分隔符,默认是tab
    -s把每个文件里的多行合成一行,每个文件一行。

    示例:

    [root❄centos7 app]☭ cat file1
    name
    aaa
    bbb
    ccc
    [root❄centos7 app]☭ cat file2
    age
    18
    20
    22
    [root❄centos7 app]☭ paste file1 file2
    name    age
    aaa     18
    bbb     20
    ccc     22
    [root❄centos7 app]☭ paste -d: file1 file2
    name:age
    aaa:18
    bbb:20
    ccc:22
    [root❄centos7 app]☭ paste -s file1 file2
    name    aaa bbb ccc
    age 18  20  22
    

    5. 分析文本

    wc

    直接运行原wc命令:输出文件中的行数、单词数、字节数

    参数:

    • -c:输出字节数
    • -m:输出字符数
    • -l :输出行数
    • -L:输出最长的行的长度。
    • -w: 输出单词统计数。
    [dell@Centos7 data]$ echo "how old are you?" | wc
          1       4      17
    # 1行4个单词17个字符;
    

    sort

    排序,默认是按照字符的大小来排列

    • -t :指定分隔符
    • -k:以哪一个为分割
    • -n:按数字大小排列,从小到大
    • -r:反向,从打到小
    • -u:删除重复的行

    示例1:

    # 以冒号分割,取第三列UID,nr表示按照数值大小倒序(由大到小)排列。
    sort -t: -k3 -nr /etc/passwd
    # 先cut只留第一列用户名和第三列UID
    cut -d: -f1,3 /etc/passwd | sort -t: -k2 -nr
    

    示例2:

    # 取分区使用率最大值
    df |tr -s " " "%"|cut -d% -f5|sort -nr|head -n1
    

    uniq

    唯一,从输入中删除前后相接的重复的行
    -c: 显示每行重复出现的次数
    -d: 仅显示重复过的行
    -u: 仅显示不曾重复的行

    常和sort 命令一起配合使用,示例:

    # 把用户名列表进行排序(重复的会在相邻的行),然后统计重复用户出现的次数:
    sort userlist.txt | uniq -c
    # 登录用户的登录次数:
    last | cut -d ' ' -f1|sort| uniq -c |sort -nr
    

    diff、patch——手动实现版本控制的工具

    diff比较两个文件的区别

    # 比较两个文件的区别,发现第5行有区别
    diff foo.conf-broken foo.conf-works
    5c5
    < use_widgets = no
    ---
    > use_widgets = yes
    

    patch可以用diff生成的patch来修复另一个文件。

    diff -u foo.conf-broken foo.conf-works > foo.patch #把差异写到foo.patch补丁里
    cp foo.conf-broken foo.conf-broken.bak #备份一下
    patch -b foo.conf-broken foo.patch # 从差异的补丁进行恢复
    

    6. 按关键字过滤

    grep

    文本过滤工具
    不带参数普通用法:

    grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

    带参数:

    • -v:显示不被pattern匹配到的行
    • -i:忽略字符大小写
    • -n:显示匹配的行号
    • -c:统计匹配的行数
    • -o:仅显示匹配到的字符串
    • -q:静默模式,不输出任何信息(quiet,可以结合echo $?状态码使用)
    • -A NUM after, 包含匹配行的后NUM行
    • -B NUM:before, 包含匹配行的前NUM行
    • -C NUM context, 包含匹配行的前后各NUM行
    • -e: 实现多个选项间的逻辑or关系
    • -w匹配整个单词(字母、下划线、数字汉字,这几个连在一起算一个单词)
    • -E使用ERE
    • -F相当于fgrep,不支持正则表达式

    参考书籍:关于grep的各个参数的具体用法,可以看《Linux Shell 脚本攻略(第2版)》4.3章节,有详细说明,这里不做赘述。

    例子:

    # 扫描172.16.252。0段的机器,如果主机是up状态(Host is up)的,显示之前一行(-B1),前一行有ip地址,然后grep for是因为只有有ip的那行有for,然后以空格为分隔符,取第五个,就是ip地址。
    nmap -v -sP 172.17.252.0/24 |grep -B1 "Host is up."|grep for|cut -d" " -f5
    

    相关文章

      网友评论

        本文标题:4.2 Linux文本处理工具

        本文链接:https://www.haomeiwen.com/subject/crnncctx.html