在 Linux 上檢視檔案內容的 5 種方法

2020-06-23 12:11:00

如何使用 cat、more、head 和 tail 命令檢視 Linux 檔案的內容,而不僅僅是文字檔案。

Linux 提供了許多命令來檢視檔案的內容,包 括 catmorehead 和 tail,但這只是一個開始。

一方面,即使是最顯而易見的命令也有很多許多使用者不會去使用的選項。還有一些普普通通的命令提供了一些獨特的功能。在本文中,我們將介紹檢視檔案內容的命令,以及如何客製化這些檢視以更好地滿足你的需求的選項。

cat

cat 命令將文字檔案的全部內容傳送到終端視窗以供檢視。實際上,如果你輸入 cat,然後輸入包含數千行內容的檔名,那麼這些行將以極快的速度在你的視窗中捲動,你將無法看到除了最後一屏外的其他文字。對於 Linux 使用者來說 cat 命令很熟悉,但即使是這個基本命令也提供了許多有用的選項,例如對輸出中的行進行編號,這是我們許多人可能從未使用過的。更進一步,你不僅可以對行進行編號,還可以選擇如何編號。

對每行進行編號就像這樣:

$ cat -n msg     1  Hello --     2     3  I hope you are having a wonderful day!     4     5     6  That's it for ...       now     7     8  bye!     9    10  s.

你也可以只對有內容的行編號。請注意,對於此命令,僅包含空格的行不被視為“空”,而是會被編號。

$ cat -b msg     1  Hello --     2  I hope you are having a wonderful day!     3  That's it for ...       now     4  bye!     5  s.

cat 命令允許你使用 -s 選項忽略重複的空白行,但是要完全忽略空白行你必須新增另一個命令。

$ cat -s msgHello --I hope you are having a wonderful day!That's it for ...       nowbye!s.

要忽略所有空白行,只需如下將 cat 的輸出通過管道傳遞給 grep 命令。 點(.)匹配包含任意字元的文字,因此它將顯示任意非空的行,用於結束一行的回車換行做匹配(LCTT 譯註:此處原文有誤,徑改)。

$ cat msg | grep .Hello --I hope you are having a wonderful day!That's it for ...       nowbye!s.

-E 選項通過在每行末尾加 $ 符提供視覺提示,來顯示行尾是否還有多餘的空格。

$ cat -E msgHello --$$I hope you are having a wonderful day!  $$$That's it for ...       now$$bye!$$s.$

使用 -A 時,既可以在每行的末尾顯示 $ 字元,並且製表符會顯示為 ^I 而不是空白。

$ cat -A msgHello --$$I hope you are having a wonderful day!$$$That’s it for ...^Inow$$bye!$$s.$

使用 head 和 tail 顯示檔案部分內容

head 和 tail 顯示檔案的頭部或尾部,預設為十行。 你可以使用 -3(顯示 3 行)或 -11(顯示 11 行)之類的字串來指定要檢視的其它行數。tail 命令與 head 的工作方式相同,但是顯示檔案的尾部而不是頭部。

$ head -3 msgHello --I hope you are having a wonderful day!$ tail -3 msgbye!s.

你還可以結合使用 head 和 tail 命令來檢視檔案中間的文字。你只需要選擇起點和想要檢視行數即可。在此例中,命令將在檔案中顯示第二個一百行,並在 cat 的幫助下為這些行編號。

$ cat -b mybigfile | head -200 | tail -100   101  Invoice #2020-06-07a sent to vendor   ...

使用 more 或者 less 瀏覽一屏文字

more 命令是一次瀏覽一屏內容的自然之選,而 less 通過使用上下鍵盤箭頭增加了在檔案中上下移動的能力,這樣你就可以遍歷內容,然後在檔案中回退。

使用 od 檢視文字的兩種方法

od(八進位制轉儲)命令能夠以常規文字和一系列 ASCII 值(即該文字在檔案中的實際編碼方式)的形式檢視檔案。在下面的例子中可以看到,帶編號的行顯示了 ASCII 數位值,而其他行則顯示了文字和不可列印的字元。

$ od -bc msg0000000 110 145 154 154 157 040 055 055 012 012 111 040 150 157 160 145          H   e   l   l   o       -   -  \n  \n   I       h   o   p   e0000020 040 171 157 165 040 141 162 145 040 150 141 166 151 156 147 040              y   o   u       a   r   e       h   a   v   i   n   g0000040 141 040 167 157 156 144 145 162 146 165 154 040 144 141 171 041          a       w   o   n   d   e   r   f   u   l       d   a   y   !0000060 012 012 012 124 150 141 164 047 163 040 151 164 040 146 157 162         \n  \n  \n   T   h   a   t   '   s       i   t       f   o   r0000100 040 056 056 056 011 156 157 167 012 012 142 171 145 041 012 012              .   .   .  \t   n   o   w  \n  \n   b   y   e   !  \n  \n0000120 163 056 012          s   .  \n

請注意,換行符顯示為 \n(八進位制 012),而製表符顯示為 \t(八進位制 011)。

od 命令特別有用的用途之一是檢視非文字檔案以獲取可以標識檔案型別的資訊。在這裡,我們看到 JFIF(JPEG 檔案交換格式)標籤,該標籤讓 file 之類報告檔案型別的命令將它標示為 jpg 檔案。這裡還有很多其他有用的資訊,特別是如果你對這些檔案的格式感到好奇的話。

在接下來的命令中,我們檢視 jpg 檔案的開始部分。

$ od -bc arrow.jpg | head -120000000 377 330 377 340 000 020 112 106 111 106 000 001 001 000 000 001        377 330 377 340  \0 020   J   F   I   F  \0 001 001  \0  \0 0010000020 000 001 000 000 377 333 000 103 000 003 002 002 002 002 002 003         \0 001  \0  \0 377 333  \0   C  \0 003 002 002 002 002 002 0030000040 002 002 002 003 003 003 003 004 006 004 004 004 004 004 010 006        002 002 002 003 003 003 003 004 006 004 004 004 004 004  \b 0060000060 006 005 006 011 010 012 012 011 010 011 011 012 014 017 014 012        006 005 006  \t  \b  \n  \n  \t  \b  \t  \t  \n  \f 017  \f  \n0000100 013 016 013 011 011 015 021 015 016 017 020 020 021 020 012 014         \v 016  \v  \t  \t  \r 021  \r 016 017 020 020 021 020  \n  \f0000120 022 023 022 020 023 017 020 020 020 377 333 000 103 001 003 003        022 023 022 020 023 017 020 020 020 377 333  \0   C 001 003 003

如果我們要 file 命令提供有關此影象的資訊,我們可能會看到類似下面這樣的資訊。file 命令從檔案開頭的資料中提取了所有這些描述性資訊:

$ file arrow.jpgarrow.png: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 500x375, components 3

使用 jp2a 將檔案視為基於文字的影象

如果你只能在命令列工作,並且想了解特定影象包含的內容,那麼可以使用 jp2a(jpeg to ascii)之類的工具提供字元渲染。影象在這種格式下的識別程度取決於檔案。不要有太多期待,因為你將看到的影象版本是“低解析度”下的測試!這是一隻解析度很低的帝王企鵝。(請離遠點看)

$ jp2a Emperor_Penguin.jpgMMMMMMMMWOdkNMMMMMMMMMMMMMMMMMMMMMMXK0kc.... ,OKMMMMMMMMMMMMMMMMMMNK0Ol...   :Xx'dNMMMMMMMMMMMMMMMMMMMMd;lx00Oo. ..xMMMMMMMMMMMMMMMMMMK.OXMMMMMN,...lMMMMMMMMMMMMMMMMMx'KXNNMMMMK....0MMMMMMMMMMMMMMMMx:kkKNWWMMMl.. 'NMMMMMMMMMMMMMMMddx0NNNWMMMK'...;NMMMMMMMMMMMMMMck0NNWWWWWMMd  ..lMMMMMMMMMMMMMM.d0KXNWWWWMMo  ...WMMMMMMMMMMMMM.xOXNNWNMMMW. ....KMMMMMMMMMMMMM'kKNKWXWMMMK  ..'.0MMMMMMMMMMMMMxckXNNNNMMMX  .:..XMMMMMMMMMMMMMW;xKNWWWMMMM. .;. NMMMMMMMMMMMMMMok0NNWNWMMMx .l..MMMMMMMMMMMMMMMkxOKXWXNMMMMl.:'dMMMMMMMMMMMMMMM0dKOdKXXNMMMMNx,WMMMMMMMMMMMMMMMWoKxldXKNNMMMMM;MMMMMMMMMMMMMMMMMxxxxdNWNXNMMMM;MMMMMMMMMMMMMMMMMxOcoo0XOOOOWMW,kMMMMMMMMMMMMMMM0xK;.cO0dNX:0XXd;NMMMMMMMMMMNkdd:,'ldXXO0xl;x0kx:;lKMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

總結

Linux 上有很多命令可以通過各種方式檢視檔案的內容。其中一些選項在你需要處理檔案內容時可能會非常有用。其它的只是……有趣。