閱讀844 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Linux 上 12 個高效的文本過濾命令

在這篇文章中,我們將會看一些 Linux 中的過濾器命令行工具。過濾器是一個程序,它從標準輸入讀取數據,在數據上執行操作,然後把結果寫到標準輸出。

因此,它可以用來以強大的方式處理信息,例如重新結構化輸出以生成有用的報告,修改文件裏麵的文本,以及其他很多係統管理任務。

下麵是 Linux 上的一些有用的文件或者文本過濾器。

1、 awk 命令

awk 是一個卓越的模式掃描和處理語言,它可被用於在 Linux 下構造有用的過濾器。你可以通過閱讀我們的awk 係列 1 到 13 部分 來開始使用它。

另外,也可以通過閱讀 awk 的 man 手冊來獲取更多的信息和使用選項。


  1. $ man awk

2、 sed 命令

sed 是一款過濾和轉換文本的強大的流編輯器。我們已經寫了兩篇關於 sed 的有用的文章,你可以通過這兒來了解:

sed 的 man 手冊已經添加控製選項和說明:


  1. $ man sed

3、 grep、 egrep、 fgrep、 rgrep 命令行

這些過濾器輸出匹配指定模式的行。它們從一個文件或者標準輸入讀取行,並且輸出所有匹配的行,默認輸出到標準輸出。

注意:主程序是 grep,這些變體與使用特定的選項的 grep 相同,如下所示(為了向後兼容性,它們依舊在使用):


  1. $ egrep = grep -E
  2. $ fgrep = grep -F
  3. $ rgrep = grep -r

下麵是一些基本的 grep 命令:


  1. tecmint@TecMint ~ $ grep "aaronkilik" /etc/passwd
  2. aaronkilik:x:1001:1001::/home/aaronkilik:
  3. tecmint@TecMint ~ $ cat /etc/passwd | grep "aronkilik"
  4. aaronkilik:x:1001:1001::/home/aaronkilik:

在 Linux 下的 grep、 egrep 和 fgrep 的差異?中,你可以了解更多。

4、 head 命令

head 用於顯示文件前麵的部分,默認情況下它輸出前 10 行。你可以使用 -n 標誌來指定顯示的行數:


  1. tecmint@TecMint ~ $ head /var/log/auth.log
  2. Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
  3. Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
  4. Jan 2 10:51:34 TecMint sudo: tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
  5. Jan 2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
  6. Jan 2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
  7. Jan 2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (uid=0)
  8. Jan 2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
  9. Jan 2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (uid=0)
  10. Jan 2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
  11. Jan 2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (uid=0)
  12. tecmint@TecMint ~ $ head -n 5 /var/log/auth.log
  13. Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
  14. Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
  15. Jan 2 10:51:34 TecMint sudo: tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
  16. Jan 2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
  17. Jan 2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root

學習如何 使用帶有 tail 和 cat 命令的 head 命令,以便在 Linux 下更有效的使用。

5、 tail 命令

tail 輸出一個文件的後麵的部分(默認 10 行)。使用 -n 選項來指定顯示的行數。

下麵的命令將會輸出指定文件的最後 5 行:


  1. tecmint@TecMint ~ $ tail -n 5 /var/log/auth.log
  2. Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
  3. Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
  4. Jan 6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
  5. Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
  6. Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

另外,tail 有一個特殊的選項 -f ,可以 實時查看一個文件的變化 (尤其是日誌文件)。

下麵的命令將會使你能夠監控指定文件的變化:


  1. tecmint@TecMint ~ $ tail -f /var/log/auth.log
  2. Jan 6 12:58:01 TecMint sshd[1269]: Server listening on :: port 22.
  3. Jan 6 12:58:11 TecMint sshd[1269]: Received SIGHUP; restarting.
  4. Jan 6 12:58:12 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
  5. Jan 6 12:58:12 TecMint sshd[1269]: Server listening on :: port 22.
  6. Jan 6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
  7. Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
  8. Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
  9. Jan 6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
  10. Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
  11. Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.

閱讀 tail 的 man 手冊,獲取使用選項和說明的完整內容:


  1. $ man tail

6、 sort 命令

sort 用於將文本文件或標準輸入的行進行排序。

下麵是一個名為 domain.list 的文件的內容:


  1. tecmint@TecMint ~ $ cat domains.list
  2. tecmint.com
  3. tecmint.com
  4. news.tecmint.com
  5. news.tecmint.com
  6. linuxsay.com
  7. linuxsay.com
  8. windowsmint.com
  9. windowsmint.com

你可以像這樣運行一個簡單的 sort 命令 來排序文件內容:


  1. tecmint@TecMint ~ $ sort domains.list
  2. linuxsay.com
  3. linuxsay.com
  4. news.tecmint.com
  5. news.tecmint.com
  6. tecmint.com
  7. tecmint.com
  8. windowsmint.com
  9. windowsmint.com

你可以有多種方式來使用 sort 命令,請參閱以下一些關於 sort 命令的有用的文章。

7、 uniq 命令

uniq 命令用於報告或者忽略重複行,它從標準輸入過濾行,並且把結果寫到標準輸出。

在對一個輸入流運行 sort 之後,你可以使用 uniq 刪除重複行,如下例所示。

為了顯示行出現的數目,使用 -c 選項,要在對比時忽略大小寫的差異,使用 -i 選項:


  1. tecmint@TecMint ~ $ cat domains.list
  2. tecmint.com
  3. tecmint.com
  4. news.tecmint.com
  5. news.tecmint.com
  6. linuxsay.com
  7. linuxsay.com
  8. windowsmint.com
  9. tecmint@TecMint ~ $ sort domains.list | uniq -c
  10. 2 linuxsay.com
  11. 2 news.tecmint.com
  12. 2 tecmint.com
  13. 1 windowsmint.com

通過閱讀 uniq 的 man 手冊來獲取進一步的使用信息和選項:


  1. $ man uniq

8、 fmt 命令行

fmt 是一款簡單的優化的文本格式化器,它重新格式化指定文件的段落,並且打印結果到標準輸出。

以下是從文件 domain-list.txt 提取的內容:


  1. 1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com

為了把上麵的內容重新格式化成一個標準的清單,運行下麵的命令,使用 -w 選項定義最大行寬度:


  1. tecmint@TecMint ~ $ cat domain-list.txt
  2. 1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com
  3. tecmint@TecMint ~ $ fmt -w 1 domain-list.txt
  4. 1.tecmint.com
  5. 2.news.tecmint.com
  6. 3.linuxsay.com
  7. 4.windowsmint.com

9、 pr 命令

pr 命令轉換文本文件或者標準輸入之後打印出來。例如在 Debian 係統上,你可以像下麵這樣顯示所有的安裝包:


  1. $ dpkg -l

為了將要打印的列表在頁麵和列中組織好,使用以下命令。


  1. tecmint@TecMint ~ $ dpkg -l | pr --columns 3 -l 20
  2. 2017-01-06 13:19 Page 1
  3. Desired=Unknown/Install ii adduser ii apg
  4. | Status=Not/Inst/Conf- ii adwaita-icon-theme ii app-install-data
  5. |/ Err?=(none)/Reinst-r ii adwaita-icon-theme- ii apparmor
  6. ||/ Name ii alsa-base ii apt
  7. +++-=================== ii alsa-utils ii apt-clone
  8. ii accountsservice ii anacron ii apt-transport-https
  9. ii acl ii apache2 ii apt-utils
  10. ii acpi-support ii apache2-bin ii apt-xapian-index
  11. ii acpid ii apache2-data ii aptdaemon
  12. ii add-apt-key ii apache2-utils ii aptdaemon-data
  13. 2017-01-06 13:19 Page 2
  14. ii aptitude ii avahi-daemon ii bind9-host
  15. ii aptitude-common ii avahi-utils ii binfmt-support
  16. ii apturl ii aview ii binutils
  17. ii apturl-common ii banshee ii bison
  18. ii archdetect-deb ii baobab ii blt
  19. ii aspell ii base-files ii blueberry
  20. ii aspell-en ii base-passwd ii bluetooth
  21. ii at-spi2-core ii bash ii bluez
  22. ii attr ii bash-completion ii bluez-cups
  23. ii avahi-autoipd ii bc ii bluez-obexd
  24. .....

其中,使用的標誌如下:

  • --column 定義在輸出中創建的列數。
  • -l 指定頁麵的長度(默認是 66 行)。

10、 tr 命令行

這個命令從標準輸入轉換或者刪除字符,然後輸出結果到標準輸出。

使用 tr 的語法如下:


  1. $ tr options set1 set2

看一下下麵的例子,在第一個命令,set1( [:upper:] ) 代表指定輸入字符的大小寫(都是大寫字符)。set2([:lower:]) 代表期望結果字符的大小寫。第二個例子意思相似,轉義字符 \n 表示在新的一行打印輸出:


  1. tecmint@TecMint ~ $ echo "WWW.TECMINT.COM" | tr [:upper:] [:lower:]
  2. www.tecmint.com
  3. tecmint@TecMint ~ $ echo "news.tecmint.com" | tr [:lower:] [:upper:]
  4. NEWS.TECMINT.COM

11、 more 命令

more 命令是一個有用的文件過濾器,最初為查看證書而建。它一頁頁顯示文件內容,用戶可以通過按回車來顯示更多的信息。

你可以像這樣使用它來顯示大文件:


  1. tecmint@TecMint ~ $ dmesg | more
  2. [ 0.000000] Initializing cgroup subsys cpuset
  3. [ 0.000000] Initializing cgroup subsys cpu
  4. [ 0.000000] Initializing cgroup subsys cpuacct
  5. [ 0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
  6. 4.4.6)
  7. [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
  8. [ 0.000000] KERNEL supported cpus:
  9. [ 0.000000] Intel GenuineIntel
  10. [ 0.000000] AMD AuthenticAMD
  11. [ 0.000000] Centaur CentaurHauls
  12. [ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
  13. [ 0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
  14. [ 0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
  15. [ 0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
  16. [ 0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
  17. [ 0.000000] x86/fpu: Using 'eager' FPU context switches.
  18. [ 0.000000] e820: BIOS-provided physical RAM map:
  19. [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
  20. [ 0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
  21. [ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
  22. [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
  23. [ 0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
  24. [ 0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
  25. --More--

12、 less 命令

less 是和上麵的 more 命令相反的一個命令,但是它提供了額外的特性,而且對於大文件,它會更快些。

按照 more 命令相同的方式使用它:


  1. tecmint@TecMint ~ $ dmesg | less
  2. [ 0.000000] Initializing cgroup subsys cpuset
  3. [ 0.000000] Initializing cgroup subsys cpu
  4. [ 0.000000] Initializing cgroup subsys cpuacct
  5. [ 0.000000] Linux version 4.4.0-21-generic (buildd@lgw01-21) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 (Ubuntu 4.4.0-21.37-generic
  6. 4.4.6)
  7. [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-generic root=UUID=bb29dda3-bdaa-4b39-86cf-4a6dc9634a1b ro quiet splash vt.handoff=7
  8. [ 0.000000] KERNEL supported cpus:
  9. [ 0.000000] Intel GenuineIntel
  10. [ 0.000000] AMD AuthenticAMD
  11. [ 0.000000] Centaur CentaurHauls
  12. [ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
  13. [ 0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
  14. [ 0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
  15. [ 0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
  16. [ 0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
  17. [ 0.000000] x86/fpu: Using 'eager' FPU context switches.
  18. [ 0.000000] e820: BIOS-provided physical RAM map:
  19. [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
  20. [ 0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
  21. [ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
  22. [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
  23. [ 0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
  24. [ 0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
  25. :

學習為什麼 Linux 下進行有效的文件瀏覽, ‘less’ 比 ‘more’ 命令更快

原文發布時間為:2017-02-17

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-05-26 08:52:27

  上一篇:go  史上導致數百萬美元損失的10大計算機漏洞
  下一篇:go  開發 | 為什麼說集成學習模型是金融風控新的殺手鐧?