Linux 上 12 個高效的文本過濾命令
下面是 Linux 上的一些有用的文件或者文本過濾器。
1、 awk 命令
awk 是一個卓越的模式掃描和處理語言,它可被用於在 Linux 下構造有用的過濾器。你可以通過閱讀我們的 awk 系列 1 到 13 部分 來開始使用它。
另外,也可以通過閱讀 awk 的 man 手冊來獲取更多的信息和使用選項。
$ man awk
2、 sed 命令
sed 是一款過濾和轉換文本的強大的流編輯器。我們已經寫了兩篇關於 sed 的有用的文章,你可以通過這兒來了解:
sed 的 man 手冊已經添加控制選項和說明:
$ man sed
3、 grep、 egrep、 fgrep、 rgrep 命令行
這些過濾器輸出匹配指定模式的行。它們從一個文件或者標準輸入讀取行,並且輸出所有匹配的行,默認輸出到標準輸出。
注意:主程序是 grep,這些變體與使用特定的選項的 grep 相同,如下所示(為了向後兼容性,它們依舊在使用):
$ egrep = grep -E
$ fgrep = grep -F
$ rgrep = grep -r
下面是一些基本的 grep 命令:
tecmint@TecMint ~ $ grep "aaronkilik" /etc/passwd
aaronkilik:x:1001:1001::/home/aaronkilik:
tecmint@TecMint ~ $ cat /etc/passwd | grep "aronkilik"
aaronkilik:x:1001:1001::/home/aaronkilik:
在 Linux 下的 grep、 egrep 和 fgrep 的差異?中,你可以了解更多。
4、 head 命令
head 用於顯示文件前面的部分,默認情況下它輸出前 10 行。你可以使用 -n
標誌來指定顯示的行數:
tecmint@TecMint ~ $ head /var/log/auth.log
Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan 2 10:51:34 TecMint sudo: tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan 2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan 2 10:51:39 TecMint sudo: pam_unix(sudo:session): session closed for user root
Jan 2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 2 10:55:01 TecMint CRON[4099]: pam_unix(cron:session): session closed for user root
Jan 2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 2 11:05:01 TecMint CRON[4138]: pam_unix(cron:session): session closed for user root
Jan 2 11:09:01 TecMint CRON[4146]: pam_unix(cron:session): session opened for user root by (uid=0)
tecmint@TecMint ~ $ head -n 5 /var/log/auth.log
Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 2 10:45:01 TecMint CRON[3383]: pam_unix(cron:session): session closed for user root
Jan 2 10:51:34 TecMint sudo: tecmint : TTY=unknown ; PWD=/home/tecmint ; USER=root ; COMMAND=/usr/lib/linuxmint/mintUpdate/checkAPT.py
Jan 2 10:51:34 TecMint sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
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 行:
tecmint@TecMint ~ $ tail -n 5 /var/log/auth.log
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan 6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
另外,tail 有一個特殊的選項 -f
,可以 實時查看一個文件的變化 (尤其是日誌文件)。
下面的命令將會使你能夠監控指定文件的變化:
tecmint@TecMint ~ $ tail -f /var/log/auth.log
Jan 6 12:58:01 TecMint sshd[1269]: Server listening on :: port 22.
Jan 6 12:58:11 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan 6 12:58:12 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan 6 12:58:12 TecMint sshd[1269]: Server listening on :: port 22.
Jan 6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
Jan 6 13:01:27 TecMint sshd[1269]: Received SIGHUP; restarting.
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on 0.0.0.0 port 22.
Jan 6 13:01:27 TecMint sshd[1269]: Server listening on :: port 22.
閱讀 tail 的 man 手冊,獲取使用選項和說明的完整內容:
$ man tail
6、 sort 命令
sort 用於將文本文件或標準輸入的行進行排序。
下面是一個名為 domain.list 的文件的內容:
tecmint@TecMint ~ $ cat domains.list
tecmint.com
tecmint.com
news.tecmint.com
news.tecmint.com
linuxsay.com
linuxsay.com
windowsmint.com
windowsmint.com
你可以像這樣運行一個簡單的 sort 命令 來排序文件內容:
tecmint@TecMint ~ $ sort domains.list
linuxsay.com
linuxsay.com
news.tecmint.com
news.tecmint.com
tecmint.com
tecmint.com
windowsmint.com
windowsmint.com
你可以有多種方式來使用 sort 命令,請參閱以下一些關於 sort 命令的有用的文章。
7、 uniq 命令
uniq 命令用於報告或者忽略重複行,它從標準輸入過濾行,並且把結果寫到標準輸出。
在對一個輸入流運行 sort
之後,你可以使用 uniq
刪除重複行,如下例所示。
為了顯示行出現的數目,使用 -c
選項,要在對比時忽略大小寫的差異,使用 -i
選項:
tecmint@TecMint ~ $ cat domains.list
tecmint.com
tecmint.com
news.tecmint.com
news.tecmint.com
linuxsay.com
linuxsay.com
windowsmint.com
tecmint@TecMint ~ $ sort domains.list | uniq -c
2 linuxsay.com
2 news.tecmint.com
2 tecmint.com
1 windowsmint.com
通過閱讀 uniq
的 man 手冊來獲取進一步的使用信息和選項:
$ man uniq
8、 fmt 命令行
fmt 是一款簡單的優化的文本格式化器,它重新格式化指定文件的段落,並且列印結果到標準輸出。
以下是從文件 domain-list.txt 提取的內容:
1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com
為了把上面的內容重新格式化成一個標準的清單,運行下面的命令,使用 -w
選項定義最大行寬度:
tecmint@TecMint ~ $ cat domain-list.txt
1.tecmint.com 2.news.tecmint.com 3.linuxsay.com 4.windowsmint.com
tecmint@TecMint ~ $ fmt -w 1 domain-list.txt
1.tecmint.com
2.news.tecmint.com
3.linuxsay.com
4.windowsmint.com
9、 pr 命令
pr 命令轉換文本文件或者標準輸入之後列印出來。例如在 Debian 系統上,你可以像下面這樣顯示所有的安裝包:
$ dpkg -l
為了將要列印的列表在頁面和列中組織好,使用以下命令。
tecmint@TecMint ~ $ dpkg -l | pr --columns 3 -l 20
2017-01-06 13:19 Page 1
Desired=Unknown/Install ii adduser ii apg
| Status=Not/Inst/Conf- ii adwaita-icon-theme ii app-install-data
|/ Err?=(none)/Reinst-r ii adwaita-icon-theme- ii apparmor
||/ Name ii alsa-base ii apt
+++-=================== ii alsa-utils ii apt-clone
ii accountsservice ii anacron ii apt-transport-https
ii acl ii apache2 ii apt-utils
ii acpi-support ii apache2-bin ii apt-xapian-index
ii acpid ii apache2-data ii aptdaemon
ii add-apt-key ii apache2-utils ii aptdaemon-data
2017-01-06 13:19 Page 2
ii aptitude ii avahi-daemon ii bind9-host
ii aptitude-common ii avahi-utils ii binfmt-support
ii apturl ii aview ii binutils
ii apturl-common ii banshee ii bison
ii archdetect-deb ii baobab ii blt
ii aspell ii base-files ii blueberry
ii aspell-en ii base-passwd ii bluetooth
ii at-spi2-core ii bash ii bluez
ii attr ii bash-completion ii bluez-cups
ii avahi-autoipd ii bc ii bluez-obexd
.....
其中,使用的標誌如下:
--column
定義在輸出中創建的列數。-l
指定頁面的長度(默認是 66 行)。
10、 tr 命令行
這個命令從標準輸入轉換或者刪除字元,然後輸出結果到標準輸出。
使用 tr
的語法如下:
$ tr options set1 set2
看一下下面的例子,在第一個命令,set1( [:upper:] )
代表指定輸入字元的大小寫(都是大寫字元)。 set2([:lower:])
代表期望結果字元的大小寫。第二個例子意思相似,轉義字元 n
表示在新的一行列印輸出:
tecmint@TecMint ~ $ echo "WWW.TECMINT.COM" | tr [:upper:] [:lower:]
www.tecmint.com
tecmint@TecMint ~ $ echo "news.tecmint.com" | tr [:lower:] [:upper:]
NEWS.TECMINT.COM
11、 more 命令
more 命令是一個有用的文件過濾器,最初為查看證書而建。它一頁頁顯示文件內容,用戶可以通過按回車來顯示更多的信息。
你可以像這樣使用它來顯示大文件:
tecmint@TecMint ~ $ dmesg | more
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 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
4.4.6)
[ 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
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] Centaur CentaurHauls
[ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[ 0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[ 0.000000] x86/fpu: Using 'eager' FPU context switches.
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
--More--
12、 less 命令
less 是和上面的 more 命令相反的一個命令,但是它提供了額外的特性,而且對於大文件,它會更快些。
按照 more
命令相同的方式使用它:
tecmint@TecMint ~ $ dmesg | less
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 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
4.4.6)
[ 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
[ 0.000000] KERNEL supported cpus:
[ 0.000000] Intel GenuineIntel
[ 0.000000] AMD AuthenticAMD
[ 0.000000] Centaur CentaurHauls
[ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x01: 'x87 floating point registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x02: 'SSE registers'
[ 0.000000] x86/fpu: Supporting XSAVE feature 0x04: 'AVX registers'
[ 0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
[ 0.000000] x86/fpu: Using 'eager' FPU context switches.
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d3ff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009d400-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000a56affff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000a56b0000-0x00000000a5eaffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000a5eb0000-0x00000000aaabefff] usable
:
學習為什麼 Linux 下進行有效的文件瀏覽, 『less』 比 『more』 命令更快。
基本上就這些了,如果你還知道其他本文沒有提供的 Linux 下有用的文本過濾命令行工具,可以在下面的評論部分通知我們。
作者簡介:Aaron Kili 是一名 Linux 和 F.O.S.S 愛好者、一名未來的 Linux 系統管理員、web 開發者,並且目前是一名 TecMint 上的內容創造者,他喜歡計算機相關的工作,並且堅信知識的分享。
via: http://www.tecmint.com/linux-file-operations-commands/
作者:Aaron Kili 譯者:yangmingming 校對:jasminepeng
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive