文本基本处理工具

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本基本处理工具相关的知识,希望对你有一定的参考价值。

    (一).整个文本输出

    • cat

    cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。

    1.命令格式:

    cat [选项] [文件]...

    2.命令功能:

    cat主要有三大功能:

    1.一次显示整个文件:cat filename

    2.从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件.

    3.将几个文件合并为一个文件:cat file1 file2 > file (先重定向file1内容、在追加file2内容到file中)

    3.命令参数:

    -A, --show-all            显示所有 包括空字符、换行符等

    -b, --number-nonblank     对非空输出行编号

    -e                        等价于 -vE

    -E, --show-ends           在每行结束处显示 $

    -n, --number      对输出的所有行编号,1开始对所有输出的行数编号

    -s, --squeeze-blank   有连续两行以上的空白行,就代换为一行的空白行    

    示例:

    cat -A f1              显示所有 包括空字符、换行符等 

    cat -n f1 f2     f1后紧接f2内容,并编号

    • tac (反向列示)

    说明:

    tac 是将 cat 反写过来,所以他的功能就跟 cat 相反, cat 是由第一行到最后一行连续显示在萤幕上,而 tac 则是由最后一行到第一行反向在萤幕上显示出来!

    • rev       (reverse)

    这个命令和cat也是反的,  不过它不像tac那样, 它输出行的顺序和cat也是一样的, 不过输出每行的时候, 先输出最后一个字符, 接着是倒数第二个字符, 最后才是第一个字符, 下面这个命令可以把输入全部倒过来:

    [[email protected] ~]# cat re
      one apple a day!

    two apple two day!
      [[email protected] ~]# rev re
      !yad a elppa eno

    !yad owt elppa owt

    • more

    more命令,功能类似 cat cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 more命令从前向后读取文件,因此在启动时就加载整个文件。

    1.命令格式:

    more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ...  ]

    2.命令功能:

    more命令和cat的功能一样都是查看文件里的内容,但有所不同的是more可以按页来查看文件的内容,还支持直接跳转行等功能。

    3.命令参数:

    +n      从笫n行开始显示

    -n        定义屏幕大小为n

    +/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示 

    -c        从顶部清屏,然后显示

    -d        提示“Press space to continue,’q to quit(按空格键继续,按q键退出)”,禁用响铃功能

    -l         忽略Ctrl+l(换页)字符

    -p        通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似

    -s        把连续的多个空行显示为一行

    -u        把文件内容中的下画线去掉

    4.常用操作命令:

    Enter    向下n行,需要定义。默认为1

    Ctrl+F   向下滚动一屏

    空格键  向下滚动一屏

    Ctrl+B  返回上一屏

    =        输出当前行的行号

    f     输出文件名和当前行的行号

    V      调用vi编辑器

    !命令   调用Shell,并执行命令 

    q        退出more

    5.命令实例:

    实例1:显示文件中从第3行起的内容

    命令:

    more +3 log2012.log

    输出:

    [[email protected] test]# cat log2012.log 

    2012-01

    2012-02

    2012-03

    2012-04-day1

    ======
      [[email protected] test]# more +3 log2012.log 

    2012-03

    2012-04-day1

    ======

    实例2:从文件中查找第一个出现"day3"字符串的行,并从该处前两行开始显示输出

    命令:

    more +/day3 log2012.log

    输出:

    [[email protected] test]# more +/day3 log2012.log 

    ...skipping

    2012-04-day1

    2012-04-day2

    2012-04-day3

    2012-05

    实例3:设定每屏显示行数

    命令:

    more -n 3 log2012.log

    输出:

    [[email protected] test]# more -n 3 log2012.log 

    2012-01

    2012-02

    2012-03

    说明:

    如下图所示,最下面显示了该屏展示的内容占文件总行数的比例,按 Ctrl+F 或者 空格键 将会显示下一屏5条内容,百分比也会跟着变化。

    • less

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。

    1.命令格式:

    less [参数] 文件

    2.命令功能:

    less more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。

    3.命令参数:

    -b <缓冲区大小设置缓冲区的大小

    -e  当文件显示结束后,自动离开

    -f  强迫打开特殊文件,例如外围设备代号、目录和二进制文件

    -g  只标志最后搜索的关键词

    -i  忽略搜索时的大小写

    -m  显示类似more命令的百分比

    -N  显示每行的行号

    -o <文件名less 输出的内容在指定文件中保存起来

    -Q  不使用警告音

    -s  显示连续空行为一行

    -S  行过长时间将超出部分舍弃

    -x <数字将“tab”键显示为规定的数字空格

    /字符串:向下搜索“字符串”的功能

    ?字符串:向上搜索“字符串”的功能

    n:重复前一个搜索(与 /  ? 有关)

    N:反向重复前一个搜索(与 /  ? 有关)

    向后翻一页

    向后翻半页

    显示帮助界面

    退出less 命令

    向前滚动半页

    向前滚动一行

    空格键 滚动一行

    回车键 滚动一页

    [pagedown] 向下翻动一页

    [pageup]  向上翻动一页

    注:less可同时查看多个文件使用n或者p进行切换

    (二).部分输出

    • head

    1.命令格式:

    head [参数]... [文件]...

    2.命令功能:

    head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。

    3.命令参数:

    -q 隐藏文件名

    -v 显示文件名

    -c<字节显示字节数

    -n<行数显示的行数

    4.使用实例:

    实例1:显示文件的前n

    命令:

    head -n 3 log2014.log

    输出:

    [[email protected] test]# cat log2014.log 

    2014-01

    2014-02

    2014-03

    2014-04

    ==============================

    [[email protected] test]# head -n 5 log2014.log 

    2014-01

    2014-02

    2014-03

    实例2:显示文件前n个字节

    命令:

    head -c 20 log2014.log

    输出:

    [[email protected] test]# head -c 20 log2014.log

    2014-01

    2014-02

    2014

    实例3:文件的除了最后n个字节以外的内容

    命令:

    head -c -32 log2014.log

    输出:

    [[email protected] test]# head -c -32 log2014.log

    2014-01

    2014-02

    2014-03

    2014-04

    2014-05

    2014-06

    2014-07

    2014-08

    2014-09

    2014-10

    2014-11

    2014-12

    实例4:输出文件除了最后n行的全部内容

    命令:

    head -n -6 log2014.log

    输出:

    [[email protected] test]# head -n -6 log2014.log

    2014-01

    2014-02

    2014-03

    2014-04

    2014-05

    2014-06

    2014-07

    • tail

    tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,

    tail -f  filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.常用于查看日志

    1.命令格式:

    tail[必要参数][选择参数][文件]

    2.命令功能:

    用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。

    3.命令参数:

    -f 循环读取

    -q 不显示处理信息

    -v 显示详细的处理信息

    -c<数目显示的字节数

    -n<行数显示行数

    --pid=PID -f合用,表示在进程ID,PID死掉之后结束

    -q, --quiet, --silent 从不输出给出文件名的首部 

    -s, --sleep-interval=S -f合用,表示在每次反复的间隔休眠S

    4.使用实例:

    实例1:显示文件末尾内容

    命令:

    tail -n 3 log2014.log   显示文件最后3行内容

    输出:

    [[email protected] test]# tail -n 5 log2014.log 

    2014-09

    2014-10

    2014-11

    ==============================

    实例2:循环查看文件内容,常用于跟踪日志

    watch -n 1 f1.log  一秒刷新日志

    tail -f f1.log      实时跟踪日志

    命令:

    tail -f test.log

    输出:

    [[email protected] ~]# ping 192.168.120.204 > test.log &

    [1] 11891[[email protected] ~]# tail -f test.log  或者watch -n 1  test.log

    PING 192.168.120.204 (192.168.120.204) 56(84) bytes of data.

    64 bytes from 192.168.120.204: icmp_seq=1 ttl=64 time=0.038 ms

    64 bytes from 192.168.120.204: icmp_seq=2 ttl=64 time=0.036 ms

    说明:

    ping 192.168.120.204 > test.log & //在后台ping远程主机。并输出文件到test.log;这种做法也使用于一个以上的档案监视。用Ctrlc来终止。

    实例3:从第5行开始显示文件

    命令:

    tail -n +5 log2014.log

    输出:

    [[email protected] test]# cat log2014.log 

    2014-01

    2014-02

    2014-03

    2014-04

    2014-05

    2014-06

    ==============================

    [[email protected] test]# tail -n +5 log2014.log

    2014-05

    2014-06

    ==============================

     

    • hexdump

    hexdump用来查看二进制文件。

    1.命令格式:

    hexdump [options] file...

    2.命令参数:

    -b 单字节八进制显示,十六进制显示偏移量,每行显示16个字符,每字符用三位显示,不足补零,列间以空格分隔

    -c 单字节字符显示,十六进制显示偏移量,每行显示16个字符,每字符三位显示,不足补空格,列间以空格分隔

    -C 标准十六进制+ascii码显示,十六进制显示偏移量,每行16个字符,每字符两位显示,不足补0,结尾显示当前16位数据的ascii码值,以|框住

    -e format_string 以指定的格式显示

    -n length 只显示length个字节的数据

    -s offset 跳过从开始的offset个字节,默认输入十进制,以0x0X开始按16进制处理,否则如以0开始按八进制处理,如果以b/k/m结尾,则原数值乘以512/1024/1048576

    -v 显示所有数据,如果不包含这一选项,对于同上一行完全相同的数据,hexdump会以*代替显示

    -x 两位十六进制显示.十六进制显示偏移量,每行8组数据,每数据占两字节,4列,不足补零,以空格分隔

    3.实例:

    [[email protected] ~]# hexdump -n10 -v -C -s 10 /bin/cat
      0000000a   00 00 00 00 00 00 02 00   3e 00                     |........>.|

    (三)按列抽取与合并

    • cut

    cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

    1、命令格式:

    cut [-bn] [file]  cut [-c] [file] cut [-df] [file]

    2.使用说明:

    cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。 如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b-c -f 标志之一。

    3主要参数:

    :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
      -c 
    :以字符为单位进行分割。
      -d 
    :自定义分隔符,默认为制表符。
      -f 
    :与-d一起使用,指定显示哪个区域。
          #: 
    #个字段
          #,#[,#]
    :离散的多个字段,例如1,3,6
          #-#
    :连续的多个字段例如1-6
         
    混合使用: 1-3,7
      -n 
    :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。

    4.cut定位方法:

    cut命令主要是接受三个定位方法:

    第一,字节(bytes),用选项-b

    第二,字符(characters),用选项-c

    第三,域(fields),用选项-f,与-d结合使用

    实例一:以字节定位

    [[email protected] ~]# ll re
      -rw-r--r-- 1 root root 57 Jan   3 22:36 re
      [[email protected] ~]# cat re
     
    two apple two day!
      tree
      four
      five
      six
      [[email protected] ~]# cut -b 1,2,5-7 re
      twapp
      tr
      fo
      fi
      si

    实例二:以字符定位

    [[email protected] ~]# ll re
      -rw-r--r-- 1 root root 57 Jan   3 22:36 re
      [[email protected] ~]# cat re
      one apple a day!

    two apple two day!
      tree
      four
      five
      six
      [[email protected] ~]# cut -c 1,3,6-8 re
      oeppl

    toppl
      te
      fu
      fv

    实例三:以域定位

    [[email protected] ~]# head -n3 /etc/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

    [[email protected] ~]# head -n3 /etc/passwd | cut -d: -f 1,3,5-7
      root:0:root:/root:/bin/bash
      bin:1:bin:/bin:/sbin/nologin
      daemon:2:daemon:/sbin:/sbin/nologin

    • paste

    paste单词意思是粘贴。该命令主要用来将多个文件的内容合并,与cut命令完成的功能刚好相反。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔新行中不同文本,除非指定-d选项,它将成为域分隔符。

    1.命令格式:

    paste [OPTION]... [FILE]...

    2、常用选项:

    -d:  指定两个文件的行合并后的分割符
      -s: 
    将每个文件合并为一行,而不是按行进行合并

    3、常见用法:

    paste file1 file2 #将两个文件的每行合并

    paste -d: file1 file2 #将两个文件的每行合并,分隔符为:

    paste -s file1 file2 #file1的内容合并为一行,将file2的内容合并为一行

    实例:

    [[email protected] ~]# cat a
      aa

    bb
      cc
      dd
      ee
      [[email protected] ~]# cat b
      xx
      hh
      cc
      zz
      ll
      [[email protected] ~]# paste a b
      aa      xx
              hh
      bb      cc
      cc      zz
      dd      ll
      ee
      [[email protected] ~]# paste -d: a b   #
    使用冒号作为分隔符
      aa:xx
      :hh
      bb:cc
      cc:zz
      dd:ll
      ee:
      [[email protected] ~]# paste -s a b #a
    文件合并一行,b文件合并一行
      aa              bb       cc      dd      ee
      xx      hh      cc      zz       ll

    • join

    join将两个文件中,指定栏位内容相同的行连接起来。

    1.命令格式:

    join [-i][-a<12>][-e<字符串>][-o<格式>] [-t<字符>][-v<12>][-1<栏位>][-2<栏位>][--help] [--version][文件1][文件2]

    2.命令参数:

    -a<12>    除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。 

    -i--igore-case   比较栏位内容时,忽略大小写的差异。 

    -o<格式>   按照指定的格式来显示结果。 

    -t<字符>   使用栏位的分隔字符。 

    -1<栏位>   连接[文件1]指定的栏位。 

    -2<栏位>   连接[文件2]指定的栏位。

    3.命令说明:

    默认连接是每个文件的第一个字段。

    指定输出字段:  -o <FILENO.FIELDNO> ... 其中FILENO=1表示第一个文件,FILENO=2表示第二个文件,FIELDNO表示字段序号,从1开始编号。默认会全部输出,但关键字列只输出一次。 比如:-o 1.1 1.2 2.2 表示输出第一个文件的第一个字段、第二个字段,第二个文件的第二个字段。

    使用示例

    示例一 内连接(忽略不匹配的行)不指定任何参数的情况下使用join命令,就相当于数据库中的内连接,关键字不匹配的行不会输出。

    [[email protected] linux]# cat month_cn.txt 
      1       
    一月
      2       
    二月
      3       
    三月
      4       
    四月
      5       
    五月
      6       
    六月
      7       
    七月
      8       
    八月
      9       
    九月
      10     
    十月
      11     
    十一月
      12     
    十二月
      13     
    十三月,故意的 
      [[email protected] linux]# cat month_en.txt 
      1       January
      2       February
      3       March
      4       April
      5       May
      6       June
      7       July
      8       August
      9       September
      10      October
      11              November
      12      December
      14      MonthUnknown

    注:注意两个文件的内容,中文版的多了十三月,英文版的多了14月,这纯粹是为了方便演示。

    [[email protected] linux]# join month_cn.txt month_en.txt   
      1 
    一月 January
      2 
    二月 February
      3 
    三月 March
      4 
    四月 April
      5 
    五月 May
      6 
    六月 June
      7 
    七月 July
      8 
    八月 August
      9 
    九月 September
      10 
    十月 October
      11 
    十一月 November
      12 
    十二月 December
      [[email protected] linux]#

    示例二 左连接(又称左外连接,显示左边所有记录)显示左边文件中的所有记录,右边文件中没有匹配的显示空白。

    [[email protected] linux]# join -a1 month_cn.txt month_en.txt    
      1 
    一月 January
      2 
    二月 February
      3 
    三月 March
      4 
    四月 April
      5 
    五月 May
      6 
    六月 June
      7 
    七月 July
      8 
    八月 August
      9 
    九月 September
      10 
    十月 October
      11 
    十一月 November
      12 
    十二月 December
      13 
    十三月
      [[email protected] linux]#

    示例三 右连接(又称右外连接,显示右边所有记录)显示右边文件中的所有记录,左边文件中没有匹配的显示空白。

    [[email protected] linux]# join -a2 month_cn.txt month_en.txt   
      1 
    一月 January
      2 
    二月 February
      3 
    三月 March
      4 
    四月 April
      5 
    五月 May
      6 
    六月 June
      7 
    七月 July
      8 
    八月 August
      9 
    九月 September
      10 
    十月 October
      11 
    十一月 November
      12 
    十二月 December
      14 MonthUnknown 
      [[email protected] linux]#

    **示例四 全连接(又称全外连接,显示左边和右边所有记录)**

    [[email protected] linux]# join -a1 -a2 month_cn.txt month_en.txt 
      1 
    一月 January
      2 
    二月 February
      3 
    三月 March
      4 
    四月 April
      5 
    五月 May
      6 
    六月 June
      7 
    七月 July
      8 
    八月 August
      9 
    九月 September
      10 
    十月 October
      11 
    十一月 November
      12 
    十二月 December
      13 
    十三月
      14 MonthUnknown 
      [[email protected] linux]#

    示例五 指定输出字段'比如参数 -o 1.1 表示只输出第一个文件的第一个字段。

    [[email protected] linux]# join -o 1.1 month_cn.txt month_en.txt 
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      [[email protected] linux]# join -o 1.1 2.2 month_cn.txt month_en.txt    
      1 January
      2 February
      3 March
      4 April
      5 May
      6 June
      7 July
      8 August
      9 September
      10 October
      11 November
      12 December
       [[email protected] linux]# join -o 1.1 2.2 1.2 month_cn.txt month_en.txt 
      1 January 
    一月
      2 February 
    二月
      3 March 
    三月
      4 April 
    四月
      5 May 
    五月
      6 June 
    六月
      7 July 
    七月
      8 August 
    八月
      9 September 
    九月
      10 October 
    十月
      11 November 
    十一月
      12 December 
    十二月
       [[email protected] linux]# join -o 1.1 2.2 1.2 1.3 month_cn.txt month_en.txt    <== 
    字段1.3并不存在 
      1 January 
    一月 
      2 February 
    二月 
      3 March 
    三月 
      4 April 
    四月 
      5 May 
    五月 
      6 June 
    六月 
      7 July 
    七月 
      8 August 
    八月 
      9 September 
    九月 
      10 October 
    十月 
      11 November 
    十一月 
      12 December 
    十二月 
      [[email protected] linux]#

    示例六:我们知道 /etc/passwd 第四个字段是 GID那个 GID 记录在  /etc/group 当中的第三个字段,请问如何将两个文件整合?

    [[email protected] ~]# head -n 3 /etc/passwd /etc/group
      ==> /etc/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

    ==> /etc/group <==
      root:x:0:root
      bin:x:1:root,bin,daemon
      daemon:x:2:root,bin,daemon
      # 
    从上面可以看到,确实有相同的部分喔!赶紧来整合一下!

    [[email protected] ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
      0:root:x:0:root:/root:/bin/bash:root:x:root
      1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon
      2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon
      # 
    同样的,相同的字段部分被移动到最前面了!所以第二个文件的内容就没再显示。

    五、文本分析

    • wc

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。

    1.命令格式:

    wc [选项]文件...

    2.命令功能:

    统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。

    3.命令参数:

    -c 统计字节数。

    -l 统计行数。

    -m 统计字符数。这个标志不能与 -c 标志一起使用。

    -w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。

    -L 打印最长行的长度。

    -help 显示帮助信息

    --version 显示版本信息

    4.使用实例:

    实例1:查看文件的字节数、字数、行数

    命令:

    wc test.txt

    输出:

    [[email protected] test]# cat test.txt 

    hnlinux

    peida.cnblogs.com

    Ubuntu

    ubuntu linux

    RedHat

    Redhat

    linuxmint

    [[email protected] test]# wc test.txt

     7   8 70 test.txt

    [[email protected] test]# wc -l test.txt 

    7 test.txt

    [[email protected] test]# wc -c test.txt 

    70 test.txt

    [[email protected] test]# wc -w test.txt 

    8 test.txt

    [[email protected] test]# wc -m test.txt 

    70 test.txt

    [[email protected] test]# wc -L test.txt 

    17 test.txt

    说明:

    7 8 70 test.txt

    行数 单词数 字节数 文件名

    实例2:用wc命令怎么做到只打印统计数字不打印文件名

    [[email protected] test]# wc -l test.txt 

    7 test.txt

    [[email protected] test]# cat test.txt |wc -l 或者 wc -l <  test.txt

    7

    说明:

    使用管道线,这在编写shell脚本时特别有用。

    实例3:用来统计当前目录下的文件数

    命令:

    ls -l | wc -l

    输出:

    [[email protected] test]# cd test6

    [[email protected] test6]# ll

    总计 604

    ---xr--r-- 1 root mail   302108 11-30 08:39 linklog.log

    ---xr--r-- 1 mail users 302108 11-30 08:39 log2012.log

    -rw-r--r-- 1 mail users      61 11-30 08:39 log2013.log

    -rw-r--r-- 1 root mail        0 11-30 08:39 log2014.log

    -rw-r--r-- 1 root mail        0 11-30 08:39 log2015.log

    -rw-r--r-- 1 root mail        0 11-30 08:39 log2016.log

    -rw-r--r-- 1 root mail        0 11-30 08:39 log2017.log

    [[email protected] test6]# ls -l | wc -l

    8

    [[email protected] test6]#

    说明:

    数量中包含当前目录

    • sort

    sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

    1.命令格式:

    sort [-fbMnrtuk] [file or stdin]

    2.主要参数:

    -f  :忽略大小写的差异,例如 A  a 视为编码相同;
      -b 
    :忽略最前面的空格符部分;
      -M 
    :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
      -n 
    :使用『纯数字』进行排序(默认是以字符串来排序的)
      -r 
    :反向排序;
      -u 
    :就是 uniq ,相同的数据中,仅出现一行代表;
      -t 
    :分隔符,默认是用 [tab] 键来分隔;
      -k 
    :以那个区间 (field) 来进行排序的意思

    实例一:对/etc/passwd 的账号进行排序

    [[email protected] ~]# cat /etc/passwd | sort
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      apache:x:48:48:Apache:/var/www:/sbin/nologin
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin

    sort 是默认以第一个数据来排序,而且默认是以字符串形式来排序,所以由字母 a 开始升序排序。

    实例二:/etc/passwd 内容是以 : 来分隔的,以第三栏来排序

    [[email protected] ~]# cat /etc/passwd | sort -t ':' -k 3
      root:x:0:0:root:/root:/bin/bash
      uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
      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

    实例三:默认是以字符串来排序的,如果想要使用数字排序:

    [[email protected] ~]#cat /etc/passwd | sort -t ':' -k 3n
      root:x:0:0:root:/root:/bin/bash
      daemon:x:1:1:daemon:/usr/sbin:/bin/sh
      bin:x:2:2:bin:/bin:/bin/sh

    实例四:默认是升序排序,如果要倒序排序

    [[email protected] ~]#cat /etc/passwd | sort -t ':' -k 3nr
      nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
      ntp:x:106:113::/home/ntp:/bin/false
      messagebus:x:105:109::/var/run/dbus:/bin/false
      sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin

    实例五:如果要对/etc/passwd,先以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序。

    [[email protected] ~]#cat /etc/passwd |   sort -t':' -k 6.2,6.4 -k 1r       
      sync:x:4:65534:sync:/bin:/bin/sync
      proxy:x:13:13:proxy:/bin:/bin/sh
      bin:x:2:2:bin:/bin:/bin/sh
      sys:x:3:3:sys:/dev:/bin/sh

    实例六:查看/etc/passwd有多少个shell:/etc/passwd的第七个域进行排序,然后去重:

    [[email protected] ~]#cat /etc/passwd |   sort -t':' -k 7 -u
      root:x:0:0:root:/root:/bin/bash
      syslog:x:101:102::/home/syslog:/bin/false
      daemon:x:1:1:daemon:/usr/sbin:/bin/sh
      sync:x:4:65534:sync:/bin:/bin/sync
      sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin

    • uniq

    uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。

    1.命令格式:

    uniq [-idcu]

    2.常用参数:

    -i:忽略大小写字符的不同;
      -c
    :显示每行重复的次数
      -u
    :只显示唯一的行
      -d
    :仅显示重复过的行

    实例:

    a.直接删除未经排序的文件,将会发现没有任何行被删除

    [[email protected] ~]#cat testfile
      hello
      world
      friend
      hello
      world
      hello

    [[email protected] ~]##uniq testfile   
      hello
      world
      friend
      hello
      world
      hello

    b.排序文件,默认是去重

    [[email protected] ~]##cat words | sort |uniq
      friend
      hello
      world

    c.排序之后删除了重复行,同时在行首位置输出该行重复的次数

    [[email protected] ~]##sort testfile | uniq -c
      1 friend
      3 hello
      2 world

    d.仅显示存在重复的行,并在行首显示该行重复的次数

    [[email protected] ~]##sort testfile | uniq -dc
      3 hello
      2 world

    e.仅显示不重复的行

    [[email protected] ~]#sort testfile | uniq -u
      friend

    • diff

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。

    1.命令格式: diff[参数][文件1或目录1][文件2或目录2]

    2.命令功能: diff命令能比较单个文件或者目录内容。如果指定比较的是文件,则只有当输入为文本文件时才有效。以逐行的方式,比较文本文件的异同处。如果指定比较的是目录的的时候,diff 命令会比较两个目录下名字相同的文本文件。列出不同的二进制文件、公共子目录和只在一个目录出现的文件。

    3.命令参数:

    -c  显示全部内文,并标出不同之处。
      -u,-U
    --unified=  以合并的方式来显示文件内容的不同。
      -i
    :忽略大小写
      -b
    --ignore-space-change):忽略空格的变化
      -B
    --ignore-blank-lines):比较时忽略空白行
      -a
    :将比较的文件都当成纯文本文件处理
      -r
    :递归比较子目录(如diff -r /etc/rc.d/rc3.d/ /etc/rc.d/rc5.d/比较两个不同开机运行级别的目录)
      -N
    --new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
      -w
    --ignore-all-space  忽略全部的空格字符。
      -W
    --width  在使用-y参数时,指定栏宽。
      -y
    --side-by-side  以并列的方式显示文件的异同之处。

    4.diff说明:

         正常格式(normal diff

      上下文格式(context diff

      合并格式(unified diff

    a、示例文件

    为了便于讲解,先新建两个示例文件。

    第一个文件叫做f1,内容是每行一个a,一共7行。

    a
      a
      a
      a
      a
      a
      a

    第二个文件叫做f2,修改f1而成,第4行变成b,其他不变。

    a
      a
      a
      b
      a
      a
      a

    b、正常格式的diff

    现在对f1f2进行比较:

    $ diff f1 f2

    这时,diff就会显示正常格式的结果:

    4c4
      < a
     
       ---
      > b

    第一行是一个提示,用来说明变动位置。

    4c4

    它分成三个部分:前面的"4",表示f1的第4行有变化;中间的"c"表示变动的模式是内容改变(change),其他模式还有"增加"a,代表addition)和"删除"d,代表deletion);后面的"4",表示变动后变成f2的第4行。

    第二行分成两个部分。

    < a

    前面的小于号,表示要从f1当中去除该行(也就是第4行),后面的"a"表示该行的内容。

    第三行用来分割f1f2

    ---

    第四行,类似于第二行。

    > b

    前面的大于号表示f2增加了该行,后面的"b"表示该行的内容。

    最早的Unix(即AT&T版本的Unix),使用的就是这种格式的diff

    c、上下文格式的diff

    上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff

    它的使用方法是加入c参数(代表context)。

    $ diff -c f1 f2

    显示结果如下:

    *** f1 2012-08-29 16:45:41.000000000 +0800
      --- f2 2012-08-29 16:45:51.000000000 +0800
      ***************
      *** 1,7 ****
       a
       a
       a
      !a
       a
       a
       a
      --- 1,7 ----
       a
       a
       a
      !b
       a
       a
       a

    这个结果分成四个部分。

    第一部分的两行,显示两个文件的基本情况:文件名和时间信息。

    *** f1 2012-08-29 16:45:41.000000000 +0800
      --- f2 2012-08-29 16:45:51.000000000 +0800

    "***"表示变动前的文件,"---"表示变动后的文件。

    第二部分是15个星号,将文件的基本情况与变动内容分割开。

    ***************

    第三部分显示变动前的文件,即f1

    *** 1,7 ****
       a
       a
       a
      !a
       a
       a
       a

    这时不仅显示发生变化的第4行,还显示第4行的前面三行和后面三行,因此一共显示7行。所以,前面的"*** 1,7 ****"就表示,从第1行开始连续7行。

    另外,文件内容的每一行最前面,还有一个标记位。如果为空,表示该行无变化;如果是感叹号(!),表示该行有改动;如果是减号(-),表示该行被删除;如果是加号(+),表示该行为新增。

    第四部分显示变动后的文件,即f2

    --- 1,7 ----
       a
       a
       a
      !b
       a
       a
       a

    除了变动行(第4行)以外,也是上下文各显示三行,总共显示7行。

    d、合并格式的diff

    如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"diff,将f1f2的上下文合并在一起显示。

    它的使用方法是加入u参数(代表unified)。

    $ diff -u f1 f2

    显示结果如下:

    --- f1 2012-08-29 16:45:41.000000000 +0800
      +++ f2 2012-08-29 16:45:51.000000000 +0800
      @@ -1,7 +1,7 @@
       a
       a
       a
      -a
      +b
       a
       a
       a

    它的第一部分,也是文件的基本信息。

    --- f1 2012-08-29 16:45:41.000000000 +0800
      +++ f2 2012-08-29 16:45:51.000000000 +0800

    "---"表示变动前的文件,"+++"表示变动后的文件。

    第二部分,变动的位置用两个@作为起首和结束。

    @@ -1,7 +1,7 @@

    前面的"-1,7"分成三个部分:减号表示第一个文件(即f1),"1"表示第1行,"7"表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,"+1,7"表示变动后,成为第二个文件从第1行开始的连续7行。

    第三部分是变动的具体内容。

     a          

     a      
       a
       a
      -a
      +b
       a
       a
       a

       
     
    除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动(第一个文件、第二个文件共有)减号表示第一个文件删除的行,加号表示第二个文件新增的行。(第一个文件变化到第二文件 增删状况)

    • patch

    实例:diff输出补丁文件,patch给旧文件打补丁

    [[email protected] ~]# cat f1
      Hi, 
      Hello, 
      How are you? 
      I am fine, 
      Thank you. 
      [[email protected] ~]# cat f2
      Hello, 
      Hi, 
      How are you? 
      I am fine. 
       [[email protected] ~]# diff -u f1 f2 > diff.patch   #
    输出不定文件
      [[email protected] ~]# patch -b f1 diff.patch    #patch
    f1打补丁并且备份原来文件
      patching file f1
      [[email protected] ~]# cat f1
      Hello, 
      Hi, 
      How are you? 
      I am fine.

    六、文本字符转换

    • tr

    tr用来从标准输入中通过替换或删除操作进行字符转换。tr主要用于删除文件中控制字符或进行字符转换。使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。

    1.命令格式:

    tr -c|-d|-s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file

    2.命令选项:

    -c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII.取反

    -d 删除字符串1中所有输入字符。
      -s 
    删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
      -t
    --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符

    3.命令说明:

    指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。

    [a-z] a-z内的字符组成的字符串。
      [A-Z] A-Z
    内的字符组成的字符串。
      [0-9] 
    数字串。
      \octal 
    一个三位的八进制数,对应有效的ASCII字符。
      [O*n] 
    表示字符O重复出现指定次数n。因此[O*2]匹配OO的字符串。

    实例一:将文件host中出现的"abc"替换为"xyz"

    [[email protected] ~]# cat host

    :a b c replace e f g replace this is a test page replace
      [[email protected] ~]# cat host|tr 'abc' 'xyz'

    :x y z replxze e f g replxze this is x test pxge replxze

    【注意】这里,凡是在host中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不是将字符串"abc"替换为字符串"xyz"

    实例二:使用tr命令“统一”字母大小写

    (小写 --> 大写)
       [[email protected] ~]# cat host | tr [a-z] [A-Z]

    :A B C REPLACE E F G REPLACE THIS IS A TEST PAGE REPLACE

    (大写 --> 小写)
       [[email protected] ~]# cat host | tr [A-Z] [a-z]

    实例二:把f109转换为aj

    [[email protected] ~]# cat f1
      A b c D

    e F G H 9 0 8 7 63

    h b mfd dgg
      [[email protected] ~]# cat f1|tr [0-9] [a-j]
      A b c D

    e F G H j a i h gd

    h b mfd dgg

    实例三:删除文件host中出现的"replace"字符

    [[email protected] ~]# cat host

    :a b c replace e f g replace this is a test page replace
      [[email protected] ~]# cat host|tr -d 'replace'

    : b     f g  this is  tst g

    【注意】这里,凡是在host文件中出现的'r','p','l','a','c','e'字符都会被删除!而不是紧紧删除出现的"replace”字符串。

    删除文件file中出现的换行'\n'、制表'\t'字符

    [[email protected] ~]# cat file | tr -d "\n\t" > new_file

    不可见字符都得用转义字符来表示的,这个都是统一的。

    实例四:删除“连续着的”重复字母,只保留第一个

    [[email protected] ~]# cat file | tr -s [a-zA-Z] > new_file

    实例五:删除空行(连续的换行符删除,删除空行)

    [[email protected] ~]# cat file | tr -s "\n" > new_file

    实例六:删除Windows文件“造成”的'^M'字符

    [[email protected] ~]# cat file | tr -d "\r" > new_file

    或者

    [[email protected] ~]# cat file | tr -s "\r" "\n" > new_file

    【注意】这里-s后面是两个参数"\r""\n",用后者替换前者

    实例七:用空格符\040替换制表符\011

    [[email protected] ~]# cat file | tr -s "\011" "\040" > new_file

    实例八:把路径变量中的冒号":",替换成换行符"\n"

    [[email protected] ~]# echo $PATH | tr -s ':' '\n'
      /usr/local/sbin
      /usr/local/bin
      /sbin
      /bin
      /usr/sbin
      /usr/bin
      /root/bin

     

    实例九:删除f1中除了数字换行之外的所有字符

    [[email protected] ~]# cat f1

    一月      1

    二月      2

    三月      3

    四月      4

    五月      5

    六月      6

    七月      7

    八月      8

    九月      9

    十月      10

    十一月    11

    十二月    12 

    十三月    13 

    [[email protected] ~]# tr -cd '[0-9]\n' < f1

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    实例十:利用ifconfigipv4地址

    [[email protected]  ~]# ifconfig|tr -cs '[0-9].' '\n'|sort -ut '.' -k3n

    127.0.0.1

    192.168.1.255

    192.168.1.8

    255.255.255.0

    实例十一:查出/tmp的权限用数字表示

    [[email protected]  ~]# stat /tmp | tail -4|head -1|tr -s ' ' ':'|cut -d: -f2|tr -dc '[0-9]\n'

    1777

    实例十二:统计/etc/init.d/functions中每个单词重复的个数

    [[email protected]  ~]# cat /etc/init.d/functions |tr -sc '[:alpha:]' '\n'|sort|uniq -c|sort -n

     

    实例十四:分区空间使用率的最大百分比值

    [[email protected]  home]# df

    Filesystem     1K-blocks    Used Available Use% Mounted on

    /dev/sda2       50264772 3793656  43911116    8% /

    tmpfs             953640      80     953560   1% /dev/shm

    /dev/sda3        9948012   22488    9413524   1% /app

    /dev/sda1         999320   40128     906764   5% /boot

    /dev/sr0         3878870 3878870         0 100% /media/CentOS_6.9_Final

    [[email protected]  home]# df |tr -s ' ' %|cut -d% -f5 |sort -nr|head -1

    100

    实例十五:找出ifconfig “网卡名” 命令结果中本机的IPv4地址

    [[email protected]  home]# ifconfig eth1

    eth1      Link encap:Ethernet  HWaddr 00:0C:29:87:D3:6C 

              inet addr:172.18.253.24  Bcast:172.18.255.255  Mask:255.255.0.0

              inet6 addr:  fe80::20c:29ff:fe87:d36c/64 Scope:Link

    [[email protected]  home]# ifconfig eth1 |head -2|tail -1|tr -s ' ' ':'|cut -d: -f4

    172.18.253.24

    实例十六:查出用户UID最大值的用户名、UIDshell类型

    [[email protected]  home]# cat /etc/passwd |sort -t: -k3 -nr|head -1|cut -d: -f1,3,7

    nfsnobody:65534:/sbin/nologin

    实例十七:查出/tmp的权限,以数字方式显示

    [[email protected]  ~]# stat /tmp

      File: `/tmp'

      Size: 4096               Blocks: 8          IO Block: 4096   directory

    Device:  802h/2050d        Inode: 2490369     Links: 35

    Access:  (1777/drwxrwxrwt)  Uid: (    0/     root)   Gid: (    0/     root)

    Access:  2017-07-24 08:06:10.000000000 +0800

    Modify:  2017-07-24 16:14:53.391972308 +0800

    Change:  2017-07-24 16:14:53.391972308 +0800

    [[email protected]  ~]# stat /tmp |head -4|tail -1|tr -s ' '|cut -d' ' -f2|tr '(' '/'|cut -d'/'  -f2

    1777

    [[email protected]  ~]# stat /tmp |head -4|tail -1|tr '(' '/'|cut -d'/' -f2

    1777


以上是关于文本基本处理工具的主要内容,如果未能解决你的问题,请参考以下文章

NLP文本处理的基本方法(超详解)

grep与基本正则表达式

文本编辑工具sed

强大的文本处理工具之三awk

文本处理

Shell脚本学习指南 [ 第四章 ] 查找与替换文本处理工具