文本处理工具:

  全屏编辑器:vim,nano

  行编辑器:

     文本处理三剑客:grep系列,sed,awk

       grep系列:grep,egrep,fgrep;统称为文件搜索工具;基于PATTERN(模式)对于给定的文本文件进行模糊搜索,grep系列所有命令默认个左右贪婪工作模式;

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

       awk:贝尔实验室产品;文本格式化工具,文件报告生成器,文件处理的编程语言


       grep系:

         grep:global search regular expression and print out the line ,利用正则表达式全面搜索并将搜索到的行显示出来;

         格式:

           grep [OPTIONS] PATTERN [FILE...]

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

          例:搜索在/etc/passwd文件夹中含有root字符串的文件:

           e38c9f2ffd7fa0943f0ec79d05fa8311.png

           PATTERN :过滤匹配条件,是由没有特殊意义的文本字符或者是正则表达式元字符组成;

在文件中查找含有空白字符的操作如下:        2bb0526bdd23bac71a631ff5a043d5e0.png;但是如果我们需要查找空白行的时候使用上述直接加空格的方法是无法找出空白行的,这时候需要用到正则表达式元字符来匹配完成我们需要查找的内容:

           正则表达式元字符:会被正则表达式处理引擎解释为特殊含义的字符(使用\来让正则表达式使用字符的本来意思,否则会被特殊解释);(元:最初的,最开始的)


           pcre(正则表达式引擎):用Perl(Perl语言)的正则表达式引擎;(默认系统以及安装好) 


           正则表达式的元字符:

             基本的正则表达式元字符:BRE

             扩展的正则表达式元字符:ERE


              基本的正则表达式元字符:BRE


                  通配符类(字符匹配类):

                    .:匹配任意单个字符                     ;

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

                    [^]:匹配任意指定范围外的单个字符(^脱字符表示排除范围内的,使命令匹配到范围外的字符)

                    下列所有的字符集都可以放置于[]之中用于匹配字符集范围内的单个字符:

                         [:lower:]:大写字母                   b30ada627d4f7f0455f8c0d9571f6c52.png

                         [:upper:]:小写字母

9ebef5b9249d74bc78388e2060662555.png

                         [:alpha:]:大小写字母

                    5d4c6a8addaa86de0ff785a6a2d5d0f0.png

                         [:digit:]:十进制数字

            60e75e54889067e93b8e1d50e739610b.png

                         [:xdigit:]:十六进制数字

               1f3705caa83c49efd508bf7d46d0940e.png

                         [:alnumber:]:所有的十进制数字+字母

                         [:punct:]:所有的标点符号和特殊字符

                59686625f817848a5aff55eb9c4982ab.png

                         [:space:]:所有的空白字符

475c54948176e665c6b3a18bf165b0fd.png

                         [a-z]:仅表示所有的小写字母

                 b7983a7027f74ef8e1ad303f7c60c52d.png;

                         [A-Z]:仅表示所有的大写字母

          24a4870ea3a2ce7d07b935e74eadab84.png

                         [0-9]:仅表示所有的十进制数码

                 77d47888843f63a6a58a5b7074936c19.png;



                  次数匹配类:该类字符前面的一个字符可以出现的次数;

                    示例:新建一个文档newtest

                     d1326ab1a285d86495244ba03df25362.png

                    *:其前面的字符可以出现任意次,即:0次,1次或多次;

                     ea473563a53b09821f2570fc432186b6.png

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

                     395f39faa036cb30a5eb4a47cdfc997f.png

                    \+:其前面的字符至少出现一次;

                    cd194583ad95c63c1350b62b4729449c.png

                    \{m,n\}:其前面的字符出现次数最少不少于m次,最多不多于n次;

                    94df2211145764c375c5c60e2fa222e6.png

                    \{m\}:其前面的字符必须出现m次;

                    6844a6d719269a1d185c8417827b0276.png

                    \{m,\}:其前面的字符最少出现m次,最多次数不限;

                    fbcfa5de25f877d84f53066f0fe986dc.png

                    \{,n\}:其前面的字符最少次数为0次,最多次数为n;

                    fa897b0a55287bc32607761202eaa375.png

                    下图是字符c前面b出现次数最多为2次:

                    71badd8c2f4ef829795bd1b14c5cc5ce.png


                    注意:在正则表达式中,表示任意长度的任意字符:.*



                  位置锚定字符:

                    行锚定:

                      行首锚定:^6f9a4c6320d12ed108375e1ebdc8810a.png

                      行尾锚定:$9de9f9bc34d0a10a80f746f2c41b1084.png

                    字(不用任何符号)锚定:

                      字首锚定:\<或者\b

                      字尾锚定:\>或者\b

                    4f254a6b3e678ce1c9300c8d1b354fb5.png


                  分组与前向引用字符:

                    \(\):将小括号当中的包含的内容作为一个不可分割的整体来处理                          7c426fbf35cc40abf18db8b196335151.png

                    \1,\2,\3...:前向引用字符

                       701034bbe77e5cb1c02c51be44a00066.png

                      正则表达式处理引擎的内置变量,\1表示前面所出现的第一组小括号中括选的内容;\2表示前面所出现的第二组小括号中括选的内容;..

                创建新文件示例:

                   aae995779f3d4eb8faf9c8f9d6a7d098.png

                    \(STRING1\(STRING2\)\):\1表示STRING1,\2表示STRING2;

                    \(STRING1\).*\(STRING2\):\1表示STRING1,\2表示STRING2;

                     使匹配到的字符前后一致,如下:

                    6ea245555cea87b6df2ccc880f605ff2.png

                   

                  或者:

                    \|:将其左右的字符或者字符串当做整体对待;

                    "C\|cat"  可以匹配到C和cat 

 在下面这个示例中,要求匹配到  一位数或者两位数:             a2067d5294b431f8064bf3424bfd0612.png


              扩展的正则表达式元字符:ERE(与基本的正则表达式元字符不同之处在于“\”的使用,在基本正则表达式元字符中必须使用“\”,而扩展的正则表达式元字符中则不使用,其他格式大致一致) egrep:可以支持扩展正则表达式元字符;所以使用egrep命令,而不是grep命令(grep命令仅支持基本正则表达式)

             


                  通配符类(字符匹配类):

                    .:匹配任意单个字符

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

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

                       下列所有的字符集都可以放置于[]之中用于匹配字符集范围内的单个字符:

                         [:lower:]:大写字母

                         [:upper:]:小写字母

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

                         [:digit:]:十进制数字

                         [:xdigit:]:十六进制数字

                         [:alnumber:]:所有十进制数字和字母

                         [:punct:]:所有特殊字符和标点符号

                         [:space:]:空格

                         [a-z]:仅表示所有的小写字母

                         [A-Z]:仅表示所有的大写字母

                         [0-9]:仅表示所有的十进制数码


                  次数匹配类:该类字符前面的一个字符可以出现的次数;

                    *:其前面的字符可以出现任意次,即:0次,1次或多次;

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

                    +:其前面的字符至少出现一次;

                    {m,n}:其前面的字符出现次数最少不少于m次,最多不多于n次;

                    {m}:其前面的字符必须出现m次;

                    {m,}:其前面的字符最少出现m次,最多次数不限;

                    {,n}:其前面的字符最少次数为0次,最多次数为n;


                    注意:在正则表达式中,表示任意长度的任意字符:.*


                  位置锚定字符:

                    行锚定:

                      行首锚定:^

                      行尾锚定:$

                    字(不用任何符号)锚定:

                      字首锚定:<或者b

                      字尾锚定:>或者b


                  分组与前向引用字符:

                    ():将小括号当中的包含的内容作为一个不可分割的整体来处理;

                    \1,\2,\3...:前向引用字符(注意:此处虽然是在扩展正则表达式元字符格式中,但是\1等表示出现次数的标志,“\”不能省略)

                      正则表达式处理引擎的内置变量,\1表示前面所出现的第一组小括号中括选的内容;\2表示前面所出现的第二组小括号中括选的内容;..

                    (STRING1(STRING2)):\1表示STRING1,\2表示STRING2;

                    (STRING1).*(STRING2):\1表示STRING1,\2表示STRING2;

  

                  或者:

                    |:将其左右的字符或者字符串当做整体对待;

                    "C|cat"  可以匹配到C和cat


         grep系:

           grep:仅支持基本正则表达式元字符

           egrep:可以支持扩展正则表达式元字符

           fgrep:不支持任何形式的正则表达式元字符,将所有的字符都视为没有任何特殊意义的普通文本字符


           常用选项:

             -A num:同时显示被PATTERN匹配到的行及其后续num行;

             8318a7628febe1aa544a9e6f846f0d6f.png

             -B num:同时显示被PATTERN匹配到的行及其前面num行;

             7bcf758f1ad645c48ba5bfd414d1e618.png

             -C num:同时显示被PATTERN匹配到的行及其前后num行;

            4864181ac975c1552294637b515442e2.png

             --color[=WHEN]:以高亮颜色显示被匹配到的内容;

             1a05b5210349d233e7c5a1239d4b983f.png

             -c,--count:不输出符合条件的行的内容,而是输出匹配到的行数;

            5dce911f0ed19cb859cd2749655be54b.png

             -E:使grep命令支持正则表达式元字符;相当于执行了egrep命令;

              09201130daa21cc4f48e32d418e3f3b5.png

              与

              c9726b5456c0d1ae0d0719b7c7ca3f11.png

             一致

              

             -e:指定多个模式,在一个命令行中生效

              ;

             -F:(固定字符串),相当于fgrep;

             -f:从指定的文件中读取多个模式用于一次搜索(把多个模式放置于指定的文件中,使用grep系命令时,引用-f选项指定多个文件使用);

             -i:忽略文件中的字符大小写

               c1c1a93f1b065e7420ebf3825425d5b0.png

             

             -o:仅显示被模式匹配到的部分(被匹配到的字符单行显示),关闭贪婪模式

              6dcf229a7d89eca6d1879e2ad0fb0ff5.png

             -q:安静模式,输出结果被撤销;相当于grep > /dev/null

             d8fcabcaae2c2cfb0ac06891a8d6d78c.png

             (执行之后虽然没有显示,但是确实是执行成功,只是静默了)

             -v:显示没有被模式匹配到的行

               8eb14530af594e7c60d0c1d35679da40.png



其他的文本处理命令:

  1.wc命令:wc - 输出文件中的行数、单词数、字节数

     格式:wc [选项列表]... [文件名列表]...

     常用选项:

      -c, --bytes, --chars

              输出字节统计数。

     

[root@localhost ~]# wc -c number.txt

52 number.txt


       -l, --lines

              输出换行符统计数。

[root@localhost ~]# wc -l number.txt

4 number.txt


       -L, --max-line-length

              输出最长的行的长度。

[root@localhost ~]# wc -L number.txt

14 number.txt


       -w, --words

              输出单词统计数。

[root@localhost ~]# wc -w number.txt

16 number.txt


       --help 显示帮助并退出

356c945aeb5935a1720439195ca82492.png


       --version

              输出版本信息并退出

1be41f8488e5c3b901b75bb7c22995c8.png



  2.cut命令:cut - 在文件的每一行中提取片断

  注意:能够被cut命令修剪的文件或数据内容一般是具有某种特定格式或结构化数的据内容或结构化的文本文档

        如:/etc/passwd

     格式:cut [OPTION]... [FILE]...

     常用选项:

       -d, --delimiter=DELIM:使用 DELIM 取代 TAB 做 字段(field) 分隔符;指定在实施修剪操作时所使用的字段分隔符,默认是tab(空白字符);

        -f, --fields=LIST:输出 这些 字段;根据指定的字段分隔符号来指定要保留的字段编号的列表;

             LIST称为字段列表,地址定界,其书写方法:

                1.NUM:选择被指定的单个数字所表示的字段,该字段将被保留;

                2.NUM1,NUM2,NUM3,...:离散的多个被指定的字段的数字的列表均被保留;

                3.NUM1-NUM3:连续的多个被指定的字段的数字的列表;所有数值所代表的字段均被保留;

                  NUM1-:从NUM1开始直到行尾的所有字段;

                  -NUM2:从行首第一个字段开始直到NUM2为止的所有字段;

        --output-delimiter=STRING:指定输出数据时的字段分隔符号;


        示例:1、[root@localhost ~]# cut -d ":" -f 1-3 /etc/passwd --output-delimiter=" "    ---以:分隔为分隔符号;显示1-3位的内容;指定输出后的字段分隔符号为空白字符;

              root x 0

 

             2、 [root@localhost ~]# df | tr -s ' ' '\t' | cut -f 3,5   ------使用tr命令压缩多个空白符为一个空白符,使用制表符“\t”代替是看起来整齐

              已用   已用%   

              3421076 22%

              0         0%

              0     0%

              9176    1%

              0        0%

              159812 80%

              12    1%

              0        0%

            6071c457e999f14921660a57df8f8c5a.png



     3.awk命令:gawk - pattern scanning and processing language

     

     常用选项:

       -F fs(--field-separator fs):指定字段分隔符,默认是(TAB)空白符


       对于awk,根据字符分隔符其乳粉出来的各字段,分别使用$1,$2,$3,...$NF来进行标识:$1,$2,$3,...$NF是awk的内部变量;


       awk|gawk [Options]... '/PATTERN/{print $1,$2}' 

       示例:

[root@localhost ~]# df | awk '{print $3,$5}'

已用 已用%

3421176 22%

0 0%

0 0%

9176 1%

0 0%

159812 80%

12 1%

0 0%


awk 命令相较于cut命令来说,更容易处理操作还能进行格式化输出。


[root@localhost ~]# df | awk '/^r/{print $1}' /etc/passwd

root:x:0:0:root:/root:/bin/bash

rpc:x:32:32:Rpcbind

rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin

rpcuser:x:29:29:RPC

radvd:x:75:75:radvd


[root@localhost ~]# awk -F : '/^r/{print $1}' /etc/passwd

root

rpc

rtkit

rpcuser

radvd


   4.sort命令:sort - 对文本文件的行排序;对于指定文件中的行,按照ASCII中的字符顺序进行排序输出

   格式:sort [OPTION]... [FILE]...

    常用选项:

创建文件num1.txt

[root@localhost ~]# cat num1.txt

12

1223

23

34

56

3

2

333

3

3

3

      -n :以数字的数值大小作为排序依据进行排序

[root@localhost ~]# sort -n num1.txt


2

3

3

3

3

12

23

34

56

333

1223

      -r :倒序显示排序结果

[root@localhost ~]# sort -nr num1.txt

1223

333

56

34

23

12

3

3

3

3

2

      -R :随机排序;不适用于复杂环境,此算法简陋;

[root@localhost ~]# sort -R num1.txt | head -1

333

[root@localhost ~]# sort -R num1.txt | head -1

12

[root@localhost ~]# sort -R num1.txt | head -1

34

[root@localhost ~]# sort -R num1.txt | head -1


[root@localhost ~]# sort -R num1.txt | head -1

2


      -u --unique:重复出现的行,只出现一次,去重作用;连续且相同的行称为重复行;

[root@localhost ~]# sort -u num1.txt


12

1223

2

23

3

333

34

56

      -t:指定字段分隔符

      -k:指定根据哪个关键字字段进行排序,一般和-t同时使用;


      [root@localhost ~]# sort -n -t ":" -k 1 /etc/passwd



  5.unique命令:uniq - 删除排序文件中的重复行

   格式:uniq [OPTION]... [INPUT [OUTPUT]]

   常用选项:

    -c:计数重复的行 


     [root@localhost ~]# sort -n num.txt | uniq -c

      1 1

    234 11

      1 23

    233 123

    234 222

    234 455

    234 3456


    -d:只显示重复的行,且每个重复的组只显示一行;

[root@localhost ~]# uniq num1.txt -c -d

      3 3

    -u, --unique:仅显示不重复的行;

[root@localhost ~]# uniq num1.txt -c -u

      1 12

      1 1223

      1 23

      1 34

      1 56

      1 3

      1 2

      1 333

      1 


  6.diff命令:diff - 找出两个文件的不同点

  格式:diff [OPTION] FILES...


     制作patch文件(制作补丁文件):

       #diff file1 file2 > patch_file


      注意:patch_file中记录的是file2的内容和file1文件相比有哪些不同;使用patch_file应该向file1打补丁;

  


  7.patch命令:patch - apply a diff file to an  original

    格式:patch [options] [originalfile [patchfile]]

     常用选项:

       -i patchfile or --input=patchfile:用于指明patch文件的路径;



例子:

  从下列数字中找出最大值和最小值:

  1 34 678 78

  3434 0 6

  23 89 778

  2324 3545 45 12

 

[root@localhost ~]# cat number.txt | tr ' ' '\n' | sort -n | head -1   ---最小值

0

[root@localhost ~]# cat number.txt | tr ' ' '\n' | sort -n | tail -1   ---最大值

3545