在我們有關 GNU 文本實用程序的連續系列中,Jacek Artymiak 對 cat 做了一下研究 — cat 這個命令是 UNIX 愛好者所熱愛的,也是厭惡 UNIX 的人所憎惡的。 您常常需要將幾個文件處理成一個文件並將這種處理的結果保存到一個單獨的輸出文件。cat(“concatenat
在我們有關 GNU 文本實用程序的連續系列中,Jacek Artymiak 對 cat 做了一下研究 — cat 這個命令是 UNIX 愛好者所熱愛的,也是厭惡 UNIX 的人所憎惡的。
您常常需要將幾個文件處理成一個文件並將這種處理的結果保存到一個單獨的輸出文件。cat(“concatenate”的縮寫)命令在其輸入上接受一個或多個文件並將它們作為一個單獨的文件打印到它的輸出。例如,cat chapter01 chapter02 chapter03 > book 將三個 chapterXX 文件保存在一個單獨的 book 文件中。
輸入文件按照它們在 cat 命令後的排列順序被打印,因此,要調換信息的順序,就必須先調換輸入文件的順序。此外,當需要處理的文件數目對於您來說過大而無法手工輸入這些文件的名稱時,您可以使用通配符,如在 cat chapter* > book 中使用的那樣,記住,文件名將會按升序排列。當您突然發現 chapter13 被發送到輸出中時會在 chapter2 之前,而會在 chapter02 之後時,這會引起很有意思的問題。
當 cat 的輸出沒有被重定向到一個文件或另一個命令的標准輸出時,cat 表現出來的行為與多數命令行工具一樣,即將其輸出發送到控制台。這意味著您可以使用 cat 來顯示文件;例如,您可以使用 cat /etc/passwd 來顯示系統密碼文件的內容。為方便起見,您應該用 less 查看大文件,如在 less /etc/passwd 中那樣(您可以通過輸入 man less 學習更多關於 less 的
知識)。
盡管 cat 主要用於合並文件,您還可以將它用於輸入的簡單自動處理。例如,您可以使用一個單獨的空白行來除去多行空白行(使用 -s 選項),這是一個在您將源代碼公諸於世前進行清除工作的好辦法。遺憾的是,cat 並沒有用於一次清除所有空白行的選項。但這並不是什麼大問題,因為您可以使用方便的 sed 命令將這些空白行除去:
清單 1. 使用 sed 與 cat 除去空白行
$ cat -s /etc/X11/XF86Config | sed '/^[[:space:]]*$/d'
...
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Red Hat 6.0 and later now use a font server independent of
# the X server to render fonts.
FontPath "/usr/X11R6/lib/X11/fonts/TrueType"
FontPath "
unix/:7100"
EndSection
...
對於讀取配置文件和 HTML 頁面的源文件,特別是那些由腳本生成的插入了不必要新行的源文件,以及那些包含大型條件結構(其各個項之間已經用空行分開)的源文件來說,空白行緊縮是一個方便的技巧。
cat 的另外一個重要的功能是它可以對行進行編號。這種功能對於程序文檔的編制以及法律和科學文檔的編制很方便。打印在左邊的行號使得參考文檔的某一部分變得容易。這在編程、科學研究、業務報告或甚至是立法工作中都是非常重要的。對行進行編號功能有兩個選項:-b 選項(只能對非空白行進行編號)和 -n 選項(可以對所有行進行編號):
清單 2. 對行進行編號
$ cat -b /etc/X11/XF86Config
...
14 # Multiple FontPath entries are allowed (they are concatenated together)
15 # By default, Red Hat 6.0 and later now use a font server independent of
16 # the X server to render fonts.
17 FontPath "/usr/X11R6/lib/X11/fonts/TrueType"
18 FontPath "unix/:7100"
19 EndSection
...
$ cat -n /etc/X11/XF86Config
...
20 # Multiple FontPath entries are allowed (they are concatenated together)
21 # By default, Red Hat 6.0 and later now use a font server independent of
22 # the X server to render fonts.
23
24 FontPath "/usr/X11R6/lib/X11/fonts/TrueType"
25 FontPath "unix/:7100"
26
27 EndSection
...
cat 還可以在您查看包含如制表符這樣的非打印字符的文件時起幫助作用。您可以用以下選項來顯示制表符:
-T 將制表符顯示為 ^I
-v 顯示非打印字符,除了換行符和制表符,它們使用各自效果相當的“控制序列”。例如,當您處理一個在
Windows 系統中生成的文件時,這個文件將使用 Control-M(^M)來標記行的結束。對於代碼大於 127 的字符,它們的前面將會被加上 M-(表示“meta”),這與其它系統中在字符前面加上 Alt- 相當。
-E 在每一行的結束處添加美元符($)。
清單 3. 顯示非打印字符
$ cat -t /etc/X11/XF86Config
...
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Red Hat 6.0 and later now use a font server independent of
# the X server to render fonts.
^IFontPath^I"/usr/X11R6/lib/X11/fonts/TrueType"
^IFontPath^I"unix/:7100"
EndSection
...
$ cat -E /etc/X11/XF86Config
...
# Multiple FontPath entries are allowed (they are concatenated together)$
# By default, Red Hat 6.0 and later now use a font server independent of$
# the X server to render fonts.$
$
FontPath "/usr/X11R6/lib/X11/fonts/TrueType"$
FontPath "unix/:7100"$
$
EndSection$
...
$ cat -v /etc/X11/XF86Config
...
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@M-|M-8^X^@^@^@
P^@^O"M-X^O M-@^M^@^@^@M-^@^O"M-@M-k^@M-8*^@
@M-^H$M-@M-9|A(M-@)M-yM-|M-sM-*M-hW^A^@^@j^@
M-|M-sM-%1M-@M-9^@^B^@^@M-sM-+fM-^A= ^@ ^@
F^@^@ ^@M-9^@^H^@^@M-sM-$M-G^E(l!M-@M-^?
^IM-A5^@^@^D^@PM-^]M-^\X1M-H%^@^@^D^@tyM-G