Linux文本查看及處理工具

Linux中,日志和配置都使用文本來存儲(chǔ)和修改,對文本的查看及處理是最基本也是最常用的操作之一。而文本處理工具中,有被稱為Linux文本處理三劍客的grep、sed和awk,但不要激動(dòng),Linux文本三劍客另起文章來講,本文先從一些經(jīng)常用到的,功能簡潔但非常實(shí)用的工具說起。

  1. wc命令
  2. cut命令
  3. sort命令
  4. uniq命令
  5. diff命令
  6. patch命令
  7. tr命令
  8. 文本處理相關(guān)示例

1、wc命令

wc,word count,從字面意思可以看出,這是一個(gè)統(tǒng)計(jì)工具,它可以實(shí)現(xiàn)行、字節(jié)、單詞的個(gè)數(shù)統(tǒng)計(jì),就個(gè)人工作而言,經(jīng)常用于統(tǒng)計(jì)端口連接數(shù)、程序打開文件數(shù)等等。

  • wc [OPTION]... [FILE]...
    • -l:lines,統(tǒng)計(jì)行數(shù)
    • -w:words,統(tǒng)計(jì)單詞數(shù)
    • -b:bytes,統(tǒng)計(jì)字節(jié)數(shù)

man手冊是這樣定義的:print newline, word, and byte counts for each file,它可以一次統(tǒng)計(jì)多個(gè)文件,單獨(dú)打印,并在最后統(tǒng)計(jì)總數(shù)。

  • 例如:分別統(tǒng)計(jì)/etc/passwd和/etc/group文件中的行數(shù),并統(tǒng)計(jì)總行數(shù):
    [root@localhost ~]# wc -l /etc/passwd /etc/group
    42 /etc/passwd
    70 /etc/group
    112 total
  • 其余兩種統(tǒng)計(jì)方式和行數(shù)統(tǒng)計(jì)相同。

2、cut命令

將標(biāo)準(zhǔn)輸出裁剪后打印。

  • cut OPTION... [FILE]...
    常用的有以下兩個(gè)選項(xiàng):

    • -d:delimiter,指明定界符,默認(rèn)定界符為tab
    • -f:fields,指明要打印的字段,以定界符分割,從左向右數(shù)
      可以打印單個(gè)字段、連續(xù)的多個(gè)字段、分散的多個(gè)字段
  • 例如,只打印出/etc/passwd中的用戶名:
    [root@localhost ~]# cut -d":" -f1 /etc/passwd
    root
    bin
    daemon
    ...

  • 打印出用戶名及使用的shell:
    [root@localhost ~]# cut -d":" -f1,7 /etc/passwd
    root:/bin/bash
    bin:/sbin/nologin
    daemon:/sbin/nologin
    ...

3、sort命令

基于行的工具,用于實(shí)現(xiàn)行的排序,默認(rèn)按行首的字符排序。
可以通過指定相關(guān)參數(shù),實(shí)現(xiàn)靈活排序。

  • sort [OPTION]... [FILE]...

    • -t CHAR:指定分隔符
    • -k #:指定用于排序的字段
    • -n:基于數(shù)值大小排序,而非字符
    • -r:逆序
    • -f:忽略字符大小寫
    • -u:unique,重復(fù)的行只保留一份
  • 例如,使用UID的數(shù)值大小,對/etc/passwd的內(nèi)容進(jìn)行排序:
    [root@localhost ~]# sort -t":" -k3 -n /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
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    ...

4、uniq命令

uniq也是基于行的工具,report or omit repeated lines,它可以對重復(fù)的行內(nèi)容進(jìn)行處理,顯示或忽略重復(fù)的行。

  • uniq [OPTION]... [INPUT [OUTPUT]]
    • -c:顯示每行的重復(fù)次數(shù)
    • -u:只顯示未重復(fù)過的行
    • -d:只顯示重復(fù)過的行
      uniq命令一般和sort命令結(jié)合使用,先用sort將行排序(因?yàn)閡niq命令是比較相鄰的行),這樣可以將重復(fù)的行排在一起。
  • 先制作一個(gè)有重復(fù)行的文件:
    [root@localhost ~]# touch /tmp/uniq.test
    [root@localhost ~]# vim /tmp/uniq.test
    aaaaa
    aaaaa
    bbbbb
    ccccc
    ddddd
    aaaaa
    bbbbb
  • 顯示每行的重復(fù)次數(shù):
    [root@localhost ~]# sort /tmp/uniq.test | uniq -c
    3 aaaaa
    2 bbbbb
    1 ccccc
    1 ddddd
  • 只顯示未重復(fù)過的行:
    [root@localhost ~]# sort /tmp/uniq.test | uniq -u
    ccccc
    ddddd
  • 只顯示重復(fù)過的行,并顯示其重復(fù)次數(shù):
    [root@localhost ~]# sort /tmp/uniq.test | uniq -dc
    3 aaaaa
    2 bbbbb

5、diff命令

逐行比對兩個(gè)文件的內(nèi)容,將不一致的地方顯示出來。

  • diff [OPTION]...FILES

    • -u:使用unified機(jī)制,即顯示要修改的行的上下文,默認(rèn)為3行。
  • 制作兩個(gè)有區(qū)別的文件,復(fù)制/etc/passwd到/tmp/passwd1和/tmp/passwd2,更改passwd1中root的UID為1500。

  • 比較/tmp/passwd1和/tmp/passwd2,顯示兩個(gè)文件中不同的行:
    [root@localhost ~]# diff /tmp/passwd1 /tmp/passwd2
    1c1 \\顯示第幾行
    < root:x:1500:0:root:/root:/bin/bash \\第一個(gè)文件中的內(nèi)容
    ---
    > root:x:0:0:root:/root:/bin/bash \\第二個(gè)文件中的內(nèi)容

  • 可以使用-u指定顯示的上下文行數(shù),便于查看上下文關(guān)系,這里指定2行:
    [root@localhost ~]# diff -u2 /tmp/passwd1 /tmp/passwd2
    --- /tmp/passwd1 2018-05-06 17:58:52.831498629 +0800
    +++ /tmp/passwd2 2018-05-06 17:58:32.489500311 +0800
    @@ -1,3 +1,3 @@
    -root:x:1500:0:root:/root:/bin/bash
    +root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin

  • diff命令還可用于生成補(bǔ)丁文件,用于將兩個(gè)文件的不同之處保存為補(bǔ)丁,便于之后用patch命令打補(bǔ)丁。其實(shí)就是將diff命令的標(biāo)準(zhǔn)輸出重定向到一個(gè)補(bǔ)丁文件中。比如,將/tmp/passwd1和/tmp/passwd2的不同之處保存到/tmp/passwd.patch補(bǔ)丁文件中:
    [root@localhost ~]# diff /tmp/passwd1 /tmp/passwd2 ``> /tmp/passwd.patch
    [root@localhost ~]# cat /tmp/passwd.patch
    1c1
    < root:x:1500:0:root:/root:/bin/bash
    ---
    > root:x:0:0:root:/root:/bin/bash
    這樣,就可以用patch命令向/tmp/passwd1打補(bǔ)丁,將其內(nèi)容更改為和/tmp/passwd2相同。

6、patch命令

apply a diff file to an original,將一個(gè)diff文件(補(bǔ)丁文件)應(yīng)用于源文件。

  • patch [options] [originalfile [patchfile]]

    • -i:指明補(bǔ)丁文件patchfile,從patchfile中讀取補(bǔ)丁內(nèi)容
  • 例如,將上述例子中的passwd.patch打補(bǔ)丁到/tmp/passwd1中,再比較passwd1和passwd2,已經(jīng)沒有任何不同:
    [root@localhost ~]# patch -i /tmp/passwd.patch /tmp/passwd1
    patching file /tmp/passwd1
    [root@localhost ~]# diff /tmp/passwd1 /tmp/passwd2
    [root@localhost ~]#

  • 還有另一種方式,即利用輸入重定向,用/tmp/passwd.patch的內(nèi)容替代標(biāo)準(zhǔn)輸入:
    [root@localhost ~]# patch /tmp/passwd1 < /tmp/passwd.patch

7、tr命令

translate or delete characters,轉(zhuǎn)換或刪除字符。

  • tr [OPTION]... SET1 [SET2]
    把輸入的數(shù)據(jù)當(dāng)中的字符,凡是在SET1定義范圍內(nèi)出現(xiàn)的,通通對位轉(zhuǎn)換為SET2出現(xiàn)的字符。
    tr命令不接受文件作為輸入, 所以tr命令要配合輸入重定向<來使用,而且tr命令只是更改顯示方式,對文件內(nèi)容不做更改。
    • -d:delete,刪除字符
  • 例如,將/etc/passwd中的root轉(zhuǎn)換為ROOT后輸出:
    [root@localhost ~]# tr [root] [ROOT] < /etc/passwd
    ROOT:x:0:0:ROOT:/ROOT:/bin/bash
  • 將/etc/passwd中的:冒號(hào)刪除后輸出:
    [root@localhost ~]# tr -d [:] < /etc/passwd
    rootx00root/root/bin/bash
    binx11bin/bin/sbin/nologin
    daemonx22daemon/sbin/sbin/nologin
    ...

8、文本處理相關(guān)示例

  • 列出當(dāng)前系統(tǒng)上所有已經(jīng)登錄的用戶的用戶名,注意:同一個(gè)用戶登錄多次,則只顯示一次即可。
    [root@localhost ~]# who | cut -d" " -f1 | uniq
    mageia
    root
  • 取出最后登錄到當(dāng)前系統(tǒng)的用戶的相關(guān)信息
    [root@localhost etc]# id $(last | head -1 | cut -d' ' -f1)
    uid=1100(mageia) gid=1100(mageia) groups=1100(mageia)
  • 取出當(dāng)前系統(tǒng)上被用戶當(dāng)作其默認(rèn)shell的最多的那個(gè)shell。
    [root@localhost ~]# cut -d":" -f7 /etc/passwd | sort | uniq -c | sort -n | tail -1
    30 /sbin/nologin
  • 將/etc/passwd中的第三個(gè)字段數(shù)值最大的10個(gè)用戶的信息全部改為大寫后保存至/tmp/maxusers.txt文件中。
    [root@localhost ~]# sort -n -t":" -k3 /etc/passwd | tail -10 | tr [a-z] [A-Z] > /tmp/maxusers.txt
    [root@localhost ~]# cat /tmp/maxusers.txt
    POLKITD:X:997:995:USER FOR POLKITD:/:/SBIN/NOLOGIN
    SYSTEMD-NETWORK:X:998:996:SYSTEMD NETWORK MANAGEMENT:/:/SBIN/NOLOGIN
    SYSTEMD-BUS-PROXY:X:999:997:SYSTEMD BUS PROXY:/:/SBIN/NOLOGIN
    USER2:X:1000:1001::/HOME/USER2:/BIN/BASH
    USER3:X:1001:2223::/HOME/USER3:/BIN/BASH
    MAGEIA:X:1100:1100::/HOME/LINUX:/BIN/BASH
    SUSE2:X:1101:1101::/HOME/SUSE2HOME:/BIN/BASH
    USER:X:1102:1102::/HOME/USER:/BIN/BASH
    SLACWARE:X:2002:2016::/HOME/SLACWARE:/BIN/TCSH
    NFSNOBODY:X:65534:65534:ANONYMOUS NFS USER:/VAR/LIB/NFS:/SBIN/NOLOGIN
  • 取出當(dāng)前主機(jī)的IP地址,提示:對ifconfig命令的結(jié)果進(jìn)行切分。
    [root@localhost ~]# ifconfig | grep inet[[:space:]] | cut -d" " -f10 | head -1
    192.168.1.150
  • 列出/etc目錄下所有以.conf結(jié)尾的文件的文件名,并將其名字轉(zhuǎn)換為大寫后保存至/tmp/etc.conf文件中。
    [root@localhost etc]# ls *.conf | tr [a-z] [A-Z] > /tmp/etc.conf
    [root@localhost etc]# cat /tmp/etc.conf
    ASOUND.CONF
    AUTOFS.CONF
    AUTOFS_LDAP_AUTH.CONF
    ...
  • 顯示/var目錄下一級(jí)子目錄或文件的總個(gè)數(shù)。
    [root@localhost ~]# ll /var | wc -l
    24
  • 取出/etc/group文件中第三個(gè)字段數(shù)值最小的10個(gè)組的名字。
    [root@localhost ~]# sort -n -t":" -k3 /etc/group | head -10 | cut -d":" -f1
    root
    bin
    daemon
    sys
    adm
    tty
    disk
    lp
    mem
    kmem
  • 將/etc/fstab和/etc/issue文件的內(nèi)容合并為同一個(gè)內(nèi)容后保存至/tmp/etc.test文件中。
    [root@localhost ~]# cat /etc/fstab /etc/issue > /tmp/etc.test
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容