在我們有關 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... |
下回我們將看一下 head 和 tail 。到時候見!同時,如果您有什麼問題或評論,我會樂於收到您的來信 — 您可以發電子郵件至 jacek@artymiak.com。
參考資料
- 您可以參閱本文在 developerWorks 全球網站上的 英文原文.
- 本系列中對文本公用程式的介紹對手冊頁和資訊頁中的資訊是一個補充。要學習更多關於這方面的知識,請開啟一個新的終端視窗並輸入
man cat 或 info cat — 或者您可以開啟一個新的瀏覽器視窗並 查看 gnu.org 上的 cat 手冊頁。
- 您還可以參閱 cat 行話檔案入門。瞭解為什麼
cat 被認為既是優秀的使用者介面設計的樣本,又是拙劣的使用者介面設計的典型樣本。
- 您可以在 GNU text utilities 手冊(位於 MIT 的 同一目錄的展開視圖,在 MIT,您還可以找到 眾多更加有用的 GNU 工具的列表)找到關於我們瞭解並喜歡的這些工具(它們都是文本公用程式)的更多資訊。
- Windows 使用者可以在 Cygwin軟體包中找到這些工具。
- Mac OS X 使用者可能想嘗試 Fink,它在 Mac OS X 下安裝豐富的 UNIX 環境。
- 您碰到了一些問題?請查閱 GNU 文本公用程式常見問題集。
- 在鑽研我們這裡講述的工具之前還需要更多介紹性的資訊?您可以嘗試從 UNIXhelp for users起步。
- 或者嘗試本系列的介紹性文章“ 技巧:瞭解 textutils”( developerWorks,2002 年 10 月)。
- 這一領域的經典著作是 UNIX Power Tools,Jerry Peek、Tim O'Reilly 和 Mike Loukides 著(O'Reilly and Associates,1997);ISBN 1-56592-260-3。
- 在 developerWorksLinux 專區 尋找您正在尋找的 Linux 參考資料。