linux上的文本三剑客之grep和文本查看工具

linux上文本处理三剑客

grep,egrep,fgrep:文本过滤工具(模式:pattern)工具:

    grep:基本正则表达式,-E:支持扩展正则表达式,-F:不支持正则表达式

    egrep:扩展正则表达式,-G:支持基本正则表达式 ,-F:不支持正则表达式

    fgrep:不支持正则表达式,-E.-G

    sed:stream editor,流编辑器;文本编辑工具

    awk:linux实现为gawk,文本报告生成器(格式化文本);

  正则表达式:(regual expression,REGEXP)由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,

  而是用于表示控制或通配的功能;主要分两类:

    基本正则表达式:BRE

    扩展正则表达式:ERE

     元字符:什么是元字符呢,这个像天书一样的东西就是元字符–>\(hello[[:space:]]\+\)\+

  grep:

    作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检测;打印匹配到的行;

     模式:由正则表达式的元字符及文本字符所编写出的过滤条件

    grep

        grep [OPTIONS] PATTERN [FILE…]

          grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

           –color=auto:自动对匹配到的文本做着色,高亮显示

           -i:ignorecase:忽略字符大小写

           -o:仅显示匹配到的字符串本身;

           -v:显示不能被模式匹配到的行

           -E:支持使用扩展的则表达式元子符

           -q:–quiet, –silent:静默模式,既不输出任何信息;

           -A:后#行

           -B:前#行

           -C:前后各#行

    基本正则表达式元字符

     字符匹配:

        .:匹配任意单个字符

       []:匹配指定范围内的任意单个字符

       [^]:匹配指定范围外的任意单个字符

        [:digit:]数字

       [:lower:]小写字母

       [:upper:]大写字母

        [:alpha:]所有大小写字母

        [:alnum:]所有字母和数字

        [:punct:]所有标点符号

        [:space:]所有空白字符

      匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式

        *:匹配其前面的字符任意次;0;1;多次

        .*:匹配任意长度的任意字符

        \?:匹配其前面的字符0次或1次,即其前面的字符可有可无

        \+:匹配其前面的字符1次或多次,即其前面的字符要出现至少1次

        \{m\}:匹配其前面的字符m(指精确数字)次;

        \{m,n\}:匹配其前面的字符至少m次,至多n次;

        \{0,n\}至多n次

        \{m,\}至少m次

     位置锚定:

        ^:行首锚定;用于模式的最左侧

        $:行尾锚定;用于模式的最右侧

        ^PATTERN$:用PATTERN来匹配整行

        ^$:空白行

        ^[[:space:]*]$:空行或包含空白字符的行

     单词锚定(单词:非特殊字符组成的连续字符(字符串)都称为单词)      

        \<或\b:词首锚定,用于单词模式的左侧

        \>或\b:词尾锚定,用于单词模式的右侧

        \<PATTERN\>:匹配完整单词;

    分组及引用

        \(\):将一个或多个字符捆绑在一起,当成一个整体进行处理,如: \(xy\)*ab      

      分组:括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:

        \1:模式从左侧起,第一个左括号以及与之匹配到的右括号之间的模式所匹配到的字符;

        \2:模式从左侧起,第二个左括号以及与之匹配到的右括号之间的模式所匹配到的字符;

        \3:模式从左侧起,第三个左括号以及与之匹配到的右括号之间的模式所匹配到的字符;        

        ]#:grep "\(l..e\).*\1" lovers.txt

      后向引用:引用前面的分组括号中的模式所匹配到的字符

    egrep:支持扩展正则表达式实现类似与grep文本过滤功能;grep -E

       grep [OPTIONS] PATTERN [FILE…]

          –color=auto:自动对匹配到的文本做着色,高亮显示

          -i:ignorecase:忽略字符大小写

          -o:仅显示匹配到的字符串本身;

          -v:显示不能被模式匹配到的行

          -E:支持使用扩展的则表达式元子符

          -q:–quiet, –silent:静默模式,既不输出任何信息;

           -A:后#行

           -B:前#行

           -C:前后各#行

           -G: 表示支持基本正则表达式

      扩展正则表达式的元字符

        字符匹配

          .:任意单个字符

          []:指定范围内的任意单个字符

          [^]:指定任意范围外的任意单个字符

         [:digit:]数字

        [:lower:]小写字母

        [:upper:]大写字母

        [:alpha:]所有大小写字母

        [:alnum:]所有字母和数字

        [:punct:]所有标点符号

        [:space:]所有空白字符

        次数匹配

          *:任意次,0,1或多次

           ?: 0次或1次;表示其前的字符可有可无

           +:其前字符至少1次;表示一次或多次

           {m}:其前的字符m次

           {m,n}:至少m次,至多n次

           {0,n}:至多n次

           {m,}:至少m次

        位置锚定:

           ^:行首锚定

           $:行尾锚定

           \<或者\b:词首锚定

           \>或者\b:词尾锚定

        分组及引用

          ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎内部的变量中;

           后向引用:\1,\2,…

          或:

           a|b:a或者b;整个左侧或者右侧

           C|cat:C或者cat

           (c|C)at:cat或者cat

文本查看工具

    cat:more: less:head:tail:

    cat:

         -n:加行号

         -b:空行不加行号

         -ns:把压缩重复的空行仅仅显示一行

         -v:显示windows的^M号

         -t:显示tab符

    tac:和cat相反显示

    rev:反向显示每一个行的每个字符

    more:分页显示,less更便捷

    less:可以一页页的翻,上下都可以,也可以搜索关键字

         -/关键字:搜索关键字

         n/N:向下和向上搜索

         !:支持shell命令,可以在输入!后输入shell命令

    head:显示头10行(默认)

         -n#:-n3(显示前3行

    tail:显示后10行(默认)

        -n#:-n3(显示后3行)用来看日志用到比较多

        -c#(-c10)只显示最后的10个字节

         -f:不会在显示信息之后自动退出, 跟踪显示文件新追加的内容,常用日志监控

            tail -f /var/log/messages

              tail -n0 -f /var/log/messages &

            此命令只显示新的日志信息,而且还可以继续操作其他命令

              必须使用fg 1 ctrl+c 才能终止后台

文本处理工具

   wc,cut,sort,uniq,diff,patch

    wc:word count:单词统计

      -l:仅显示行数

      -w:仅显示单词数

      -c:仅显示字节数

       -m:仅仅显示字符数

    示例

    [root@ali ~]# netstat -nt(此命令显示当前系统的网络链接状态,可以结合wc命令得出行数,单词数,字节数)

    Active Internet connections (w/o servers)

    Proto Recv-Q Send-Q Local Address               Foreign Address             State

    tcp        0      0 10.1.253.109:22             10.1.250.14:51155           ESTABLISHED

    [root@ali ~]# netstat -nt |wc

      3      19     219   (左侧3表示行数,19表示单词数,219表示字节数)

    cut:以列切割

      -d CHAR:以指定的字符为分隔符

      -f FIELDS:挑选出的字段

      #:指定的单个字段

      #-#:连续的多个字段

      #,#:离散的多个字段

    示例(1)

    [root@ali ~]# cat /etc/passwd | cut -d: -f1,3,7

    root:0:/bin/bash

    bin:1:/sbin/nologin

    命令解析:cat /etc/passwd 然后通过管道给cut -d: -f1,3,7:以冒号为分割符,列出第1,3,7列    

    示例(2)

    [root@ali ~]# ifconfig |cut -d: -f2 |cut -d' ' -f1 |head -2 |tail -1

    10.1.253.109

    命令解析:使用cut和head,tail结合取出ifconfig中的ip地址

    paste 合并两个文件同行号的列到一行

      -d分隔符:指定分隔符,默认TAB

      -s:所有行合并成一行显示

      paste f1 f2

      paste -s f1 f2

    sort:排序

      -n:基于数值大小排序,而非字符进行排序

      -t CHAR:指定分隔符

      -k #:用于排序比较的字段

      -r:逆序排序

      -f:忽略字符大小写

      -u:重复的行只保留一份;

      uniq:报告和移除重复的行

      -c:显示每行的重复次数

      -u: 仅显示未曾重复过的行

      -d: 仅显示重复过的行

    示例

    cat /etc/init.d/functions |tr -cs '[[:alpha:]]' '\n' |uniq -cd

    命令解析:cat查看文件管道给tr -cs把所有字母以外的全部替换成换行,然后给uniq -cd

    仅仅显示重复过的行和重复的次数,找出/etc/init.d/functions每个单词重复的次数。

    diff:找出两个文件的不同点,并且生成补丁

    diff [选项] 源文件 目标文件

    生成补丁

    diff/path/to/oldfile /path/to/newfile > /path/to/patch_file

      -u:使用unfied机制,即显示要修改的行的上下文,默认认为3行,可以使用-c定义为多少行

    示例:显示出了不同行的上下各3行

    [root@ali ~]# diff -u f1 f1.new

    — f1 2016-08-04 07:01:29.302813685 +0800

    +++ f1.new 2016-08-04 07:02:10.501812744 +0800

    @@ -1,6 +1,6 @@

    Filesystem     1K-blocks    Used Available Use% Mounted on

    /dev/sda2       82438832 3739076  74505452   5% /

    -tmpfs             502068     224    501844   1% /dev/shm

    +tmpfs i am fi.new            502068     224    501844   1% /dev/shm

    /dev/sda1         194241   34079    149922  19% /boot

    /dev/sda3       20027260   45504  18957756   1% /testdir

    /dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final

    patch:向文件打补丁

    patch[options] -i /path/to/patch_file  /path/to/oldfile

    也可以是使用输入重定向方法

    patch/path/to/oldfile < /path/to/path_file


原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/29821