zoukankan      html  css  js  c++  java
  • Linux(三)高级文本处理命令

    一、cut (cut 命令可以从一个文本文件或者文本流中提取文本列 )

          1、cut语法

              cut -d '分隔字符' -f fields         用于有特定分隔字符

              cut  -c 字符区间                    用于排列整齐的信息

             选项与参数:
                 -d:后面接分隔字符。与 -f 一起使用
                 -f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思
                 -c:以字符 (characters) 的单位取出固定字符区间

         2、例:

               echo $PATH            /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

               将 PATH 变量取出,找出第五个路径      echo $PATH | cut -d ':' -f 5                    /usr/sbin

                将 PATH 变量取出,找出第三和第五个路径         echo $PATH | cut -d ':' -f 3,5                  /sbin:/usr/sbin

                将 PATH 变量取出,找出第三到最后一个路径          echo $PATH | cut -d ':' -f 3-                  /sbin:/bin:/usr/sbin:/usr/bin:/root/bin

                将 PATH 变量取出,找出第一到第三,还有第五个路径        echo $PATH | cut -d ':' -f 1-3,5          /usr/local/sbin:/usr/local/bin:/sbin:/usr/sbin

         3、例          

               先准备已空格分开的这么段数据:
                  huangbo 18 jiangxi
                  xuzheng 22 hunan
                  wangbaoqiang 44 liujiayao

              获取中间的年龄: cut -f 2 -d ' ' sutdent.txt             

                 18
                 22
                 44

               获取第二个字符到第三个字符之间的字符:cut -c 2-3 sutdent.txt              

                  ua
                  uz
                  an

    二、grep

          1、基本使用

               查询包含hadoop的行      grep  hadoop  /etc/password

               grep hadoop ./*.txt ## 寻找当前路径下的所有 txt 当中内容那些是带了 huangbo 字符串的                       

                          ./mazhonghua.txt:my name is huangbo is is huangbo
                          ./sutdent.txt:huangbo 18 jiangxi

            2、cut 截取以:分割保留第七段

                   grep hadoop /etc/passwd | cut -d: -f 7                                 /bin/bash        

            3、 查询不包含 hadoop 的行
                  grep -v hadoop /etc/passwd       

            4、 正则表达包含 oo
                  grep '.*oo.*' /etc/passwd
                             root:x:0:0:root:/root:/bin/bash
                             lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
                             mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
                             uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

             5、 正则表达(点代表任意一个字符)          grep 'h.*p' /etc/passwd

             6、 正则表达以 hadoop 开头                 grep '^hadoop' /etc/passwd

             7、 正则表达以 hadoop 结尾                  grep 'hadoop$' /etc/passwd               

                           正则表达式的简单规则:
                             . : 任意一个字符
                           a* : 任意多个 a(零个或多个 a)
                           a? : 零个或一个 a
                          a+ : 一个或多个 a
                           .* : 任意多个任意字符
                           . : 转义.
                    o{2} : o 重复两次

              8、查找不是以#开头的行       grep -v '^#' a.txt | grep -v '^$'              ( '^$'代表空行)                   

                         hua$
                         liu
                         de

                   grep -v '^#' huangbo.txt                      

                        hua$
                        liu

                        de

               9、以 h 或 r 开头的            grep '^[hr]' /etc/passwd              

                   不是以 h 和 r 开头的       grep '^[^hr]' /etc/passwd
                    不是以 h 到 r 开头的      grep '^[^h-r]' /etc/passwd

    三、sed 命令      

          1、 删除: d 命令
                sed '2d' huangbo.txt -----删除 huangbo.txt 文件的第二行。
                sed '2,$d' huangbo.txt -----删除 huangbo.txt 文件的第二行到末尾所有行。
                sed '$d' huangbo.txt -----删除 huangbo.txt 文件的最后一行。
                sed '/test/'d huangbo.txt -----删除 huangbo.txt 文件所有包含 test 的行。

           2、 替换: s 命令
                sed 's/test/mytest/g' huangbo.txt      ## 在整行范围内把 test 替换为 mytest。如果没有 g 标记,则只有每行第一个匹配的 test 被替换成 mytest。
                sed -n 's/^test/mytest/p' huangbo.txt      ## (-n)选项和 p 标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头 的 test 被替换成 mytest,就打印它。
                sed 's/^192.168.0.1/&localhost/' huangbo.txt
                sed -n 's/4444444/&test/gp' huangbo.txt      ## &符号表示追加一个串到找到的串后。所有以 192.168.0.1 开头的行都会被替换成它自已 加 localhost,变成 192.168.0.1localhost。
               

                sed -n 's/(love)able/1rs/p' huangbo.txt
                sed -n 's/(wang)www/1test/p' huangbo.txt         ## love 被标记为 1,所有 loveable 会被替换成 lovers,而且替换的行会被打印出来。

                sed 's#10#100#g' huangbo.txt                             ## 不论什么字符,紧跟着 s 命令的都被认为是新的分隔符,所以,“ #”在这里是分隔符, 代替了默认的“ /”分隔符。表示把所有 10 替换成 100。 

                选定行的范围:逗号
                sed -n '/test/,/check/p' huangbo.txt
                sed -n 's#4444444#bbbbbbb#gp' huangbo.txt        ## 所有在模板 test 和 check 所确定的范围内的行都被打印。

                sed -n '5,/^test/p' huangbo.txt                  ## 打印从第五行开始到第一个包含以 test 开始的行之间的所有行。
                

                sed '/test/,/check/s/$/sed test/' huangbo.txt         ## 对于模板 test 和 west 之间的行,每行的末尾用字符串 sed test 替换。
                多点编辑: e 命令
                sed -e '1,5d' -e 's/test/check/' huangbo.txt           ## (-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除 1 至 5 行,第二 条命令用 check 替换 test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那 么第一个替换命令将影响第二个替换命令的结果。

                sed --expression='s/test/check/' --expression='/love/d' huangbo.txt        ## 一个比-e 更好的命令是--expression。它能给 sed 表达式赋值。
          

           3、 从文件读入: r 命令
               sed '/test/r file' huangbo.txt        -----file 里的内容被读进来,显示在与 test 匹配的行下面,如果匹配多行,则 file 的内容将显 示在所有匹配行的下面。
     
           4、 写入文件: w 命令
               sed -n '/test/w file' huangbo.txt         -----在 huangbo.txt 中所有包含 test 的行都被写入 file 里。

           5、 追加命令: a 命令
              sed '/^test/a\--->this is a example' huangbo.txt        ## '--->this is a example'被追加到以 test 开头的行(另起一行)后面, sed 要求命令 a 后面有一 个反斜杠。
           6、 插入: i 命令
             sed '/test/i\some thing new -------------------------' huangbo.txt      如果 test 被匹配,则把反斜杠后面的文本插入到匹配行的前面。
           7、 下一个: n 命令
             sed '/test/{ n; s/aa/bb/; }' huangbo.txt     -----如果 test 被匹配,则移动到匹配行的下一行,替换这一行的 aa,变为 bb,并打印该行, 然后继续。

           8、 退出: q 命令
             sed '10q' huangbo.txt         -----打印完第 10 行后,退出 sed。 
    四、AWK

         awk 是一个强大的文本分析工具,相对于 grep 的查找, sed 的编辑, awk 在其对数据分析并  生成报告时,显得尤为强大。简单来说 awk 就是把文件逐行的读入,以空格为默认分隔符 将每行切片,切开的部分再进行各种分析处理。 
        1、假设 last -n 5的输出如下
           

    root pts/0 192.168.123.1 Wed Dec 28 01:55 still logged in
    reboot system boot 2.6.32-573.el6.x Tue Dec 27 04:25 - 03:11 (22:46)
    root pts/1 192.168.123.1 Tue Dec 27 02:00 - 02:00 (00:00)
    root pts/1 192.168.123.1 Tue Dec 27 01:59 - 02:00 (00:00)
    root pts/0 192.168.123.1 Tue Dec 27 01:59 - down (00:16)

        2、只显示5个最近登录的账号           last -n 5 | awk '{print $1}'       

    root
    reboot
    root
    root
    root

    awk 工作流程是这样的:读入有' '换行符分割的一条记录,然后将记录按指定的域分隔符 划分域,填充域, $0 则表示所有域,$1 表示第一个域,$n 表示第 n 个域。默认域分隔符是"空 白键" 或 "[tab]键",所以$1 表示登录用户, $3 表示登录用户 ip,以此类推
       3、 显示/etc/passwd 的账户:   cat /etc/passwd |awk -F ':' '{print $1}'

    root
    bin
    daemon
    adm
    lp
    这种是 awk+action 的示例,每行都会执行 action{print $1}。   -F 指定域分隔符为':'
       4、显示/etc/passwd 的账户和账户对应的 shell,而账户与 shell 之间以 tab 键分割                 cat /etc/passwd |awk -F ':' '{print $1" "$7}'

    root /bin/bash
    bin /sbin/nologin
    daemon /sbin/nologin
    adm /sbin/nologin
    lp /sbin/nologin    

       5、 如果只是显示/etc/passwd 的账户和账户对应的 shell,而账户与 shell 之间以逗号分割,而且 在所有行添加列名 name,shell,在最后一行添加"blue,/bin/nosh"。

    cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
    cat /etc/passwd | awk -F ':' 'BEGIN {print "name shell"} {print$1" "$7} END {print "blue,/bin/bash"}'
        结果:

    name,shell
    root,/bin/bash
    daemon,/bin/sh
    bin,/bin/sh
    sys,/bin/sh
    ....
    blue,/bin/nosh        

            awk 工作流程是这样的:先执行 BEGING,然后读取文件,读入有/n 换行符分割的一条记录, 然后将记录按指定的域分隔符划分域,填充域, $0 则表示所有域,$1 表示第一个域,$n 表示 第 n 个域,随后开始执行模式所对应的动作 action。接着开始读入第二条记录•直到所有的记
    录都读完,最后执行 END 操作。

        6、搜索/etc/passwd 有 root 关键字的所有行           awk -F: '/root/' /etc/passwd

             root:x:0:0:root:/root:/bin/bash
    这种是 pattern的使用示例,匹配了 pattern(这里是 root)的行才会执行 action(没有指定 action, 默认输出每行的内容)。
        7、搜索支持正则,例如找 root 开头的: awk -F: '/^root/' /etc/passwd
    搜索/etc/passwd root 关键字的所有行,并显示对应的 shell
    awk -F':' '/root/{print $7}' /etc/passwd
    /bin/bash
    这里指定了 action{print $7}

         8、统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

    awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

    awk -F':' '{print "filename:" FILENAME ",linenumber:" NR ",colums:" NF "linecotent:" $0}' /etc/passwd
          结果:

    filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
    filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
    filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh    

       使用 printf 替代 print,可以让代码更加简洁,易读 
    awk -F ':'  '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s ",FILENAME,NR,NF,$0)}'    /etc/passwd


         



  • 相关阅读:
    LeetCode 230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)
    LeetCode 216. 组合总和 III(Combination Sum III)
    LeetCode 179. 最大数(Largest Number)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
    指针变量、普通变量、内存和地址的全面对比
    MiZ702学习笔记8——让MiZ702变身PC的方法
    你可能不知道的,定义,声明,初始化
    原创zynq文章整理(MiZ702教程+例程)
  • 原文地址:https://www.cnblogs.com/liuwei6/p/6665834.html
Copyright © 2011-2022 走看看