????????如果我們要查看一個文件的內容時,該如何是好?
這里有相當多有趣的命令可以來分享一下:最常使用的顯示文件內容的命令可以說是cat與more及less了。
此外,如果我們要查看一個很大的文件(好幾百MB時),但是我們只需要后面的幾行字而已,那么該如何是好?
呵呵,用tail呀。此外,tac這個命令也可以達到這個目的。好了,說說各個命令的用途。
- cat :由第一行開始顯示文件內容。
- tac:從最后一行開始顯示,可以看出tac是cat的倒著寫、
- nl:顯示的時候,同時輸出行號。
- more:一頁一頁地顯示文件內容。
- less:與more類似,但是比more更好的是,它可以往前翻頁。
- head:只看前面幾行。
- tail :只看后面幾行。
- od :以二進制的方式讀取文件內容。
1.直接查看文件內容
直接查看一個文件的內容可以使用cat/tac/nl這幾個命令。
1.1.cat ( concatenate)
選項與參數:
- -A:相當于-vET的整合選項,可列出一些特殊字符而不是空白而已;
- -b:列出行號,僅針對非空白行做行號顯示,空白行不標行號;
- -E:將結尾的換行符S顯示出來;
- -n:打印出行號,連同空白行也會有行號,與-b的選項不同;
- -T:將[tab]按鍵以^I(大寫的i)顯示出來;
- -v :列出一些看不出來的特殊字符;
范例一:查看/etc/issue 這個文件的內容
范例二:承上題,如果還要打印行號?所以這個文件有三行,看到了吧!可以列出行號。這對于大文件要找某個特定的行時,有點用處.
#如果不想要顯示空白行的行號,可以使用【cat -b /etc/issue 】,自己測試看看。
范例三:將/etc/man db.conf的內容完整的顯示出來(包含特殊字符)。
……(下面省略)…….上面的結果限于篇幅,我刪除掉了很多數據。另外,輸出的結果并不會有特殊字體,
上面的特殊字體是要讓您發現差異點在哪里,
基本上,在一般的環境中,使用[tab]與空格鍵的效果差不多,都是一堆空白。我們無法知道兩者的差別。?此時使用cat -A就能夠發現那些空白的地方是啥鬼東西了。
[tab]會以^I表示,換行符則是以表示$表示,
所以你可以發現每一行后面都是$,不過換行符在Windows/Linux則不太相同,Windows的換行符是^M$.
????????嘿嘿,Linux里面有“貓”命令?不是的,cat是Concatenate(串聯)的簡寫,主要的功能是將一個文件的內容連續打印在屏幕上面。例如上面的例子中,我們將/etc/issue打印出來,如果加上-n或-b的話,則每一行前面還會加上行號。
????????個人比較少用cat。畢竟當你的文件內容的行數超過40行以上,根本來不及在屏幕上看到結果。所以,配合等一下要介紹的more或是 less來執行比較好。
????????此外,如果是一般的DOS文件時,就需要特別留意一些奇怪的符號了,例如換行與[Tab]等要顯示出來,就得加入-A之類的選項。
1.2.tac(反向列示)
與剛剛上面的范例一比較,是由最后一行先顯示。
????????tac 這個好玩了。怎么說?詳細看一下,cat與tac,有沒有發現?
對,tac 剛好是將cat反寫動來,所以它的功能就跟cat相反,cat 是由第一行到最后一行連續顯示在屏幕上,而tac則是由最盡一行到第一行反向在屏幕上顯示出來,很好玩吧!
1.3.nl(添加行號打印)
選項與參數
-b:指定行號指定的方式,主要有兩種
- -b a:表示不論是否為空行,也同樣列出行號(類似cat -n);
- -b? t:如果有空行,空的那一行不要列出行號(默認值);
-n:列出行號表示的方法,主要有三種:
- -n 1n:行號在屏幕的最左方顯示;
- -n rn:行號在自己欄位的最右方顯示,且不加0;
- -n rz:行號在自己欄位的最右方顯示,且加0;行號欄位的占用的字符數。
-w:行號欄位占用的字符數
范例一:用nl列出/etc/issue的內容.
注意看,這個文件其實有三行,第三行為空白(沒有任何字符),
因為它是空白行,所以nl不會加上行號,如果確定要加上行號,可以這樣做。
#呵呵,行號加上來,那么如果要讓行號前面自動補上0?可以這樣。
嘿嘿,自動在自己欄位的地方補上0了,默認欄位是六位數,如果想要改成3位數?
nl 可以將輸出的文件內容自動地加上行號,其默認的結果與cat-n有點不太一樣,nl可以將行號做比較多的顯示設計,包括位數與是否自動補齊0等的功能。
有的復雜啊!!!不過別擔心,這個基本不用的
2.可翻頁查看
nl與cat、tac等,都是一次性地將數據一口氣顯示到屏幕上面,那有沒有可以進行一頁一頁翻動的命令?
讓我們可以一頁一頁的觀察,才不會前面的數據看不到。有,那就是more與less。
2.1.more(一頁一頁翻動)
這樣子 文件里的內容就一頁一頁的展示給我們了
重點在最后一行,你的光標也會在這里等待你的命令
????????仔細地給它看到上面的范例,如果more后面接的文件內容行數大于屏幕輸出的行數時,就會出現類似上面的圖例。重點在最后一行,最后一行會顯示出目前顯示的百分比,而且還可以在最后一行輸入一些有用的命令。
在more 這個程序的運行過程中,你有幾個按鍵可以使用:
- 空格鍵(space):代表向下翻一頁;
- Enter:代表向下翻一行;
- /字符串:代表在這個顯示的內容當中,向下查找字符串這個關鍵詞;
- :f:立刻顯示出文件名以及目前顯示的行數;
- q:代表立刻離開more,不再顯示該文件內容;
- b或[ctrl]-b:代表往回翻頁,不過這操作只對文件有用,對管道無用。
要離開more 這個命令的顯示工作,可以按下q就能夠離開。而要向下翻頁,使用空格鍵即可。
比較有用的是查找字符串的功能,
舉例來說,我們使用more /etc/man_db.conf來觀察該文件,若想要在該文件內查找MANPATH這個字符串時,可以在底行處輸入/MANPATH
輸入了/之后,光標就會自動跑到最下面一行等待輸入
如同上面的說明,輸入了/之后,光標就會跑到最下面一行,并且等待你的輸入,你輸入了字符串并按下[enter]之后,more就會開始向下查找該字符串,而重復查找同一個字符串,可以直接按下n即可。最后,不想要看了,就按下q即可離開more。
more的缺點就是只能往后翻!!!!!
2.2.less(一頁一頁翻動)
我們先看例子
和more好像差不多?
????????less的用法比起more又更加有彈性,在more的時候,我們并沒有辦法向前面翻,只能往后面看,但若使用了less 時,就可以使用【pageup]、[pagedown]等按鍵的功能來往前往后翻看文件,你看是不是更容易觀看一個文件的內容了。
除此之外,在less 里面可以擁有更多的查找功能。不止可以向下查找,也可以向上查找,實在是很不錯,基本上,可以輸入的命令有:
- 空格鍵:向下翻動一頁;
- [pagedown]:向下翻動一頁;
- [pageup]:向上翻動一頁;
- /字符串:向下查找字符串的功能;
- ?字符串:向上查找字符串的功能;
- n:重復前一個查找(與/或?有關);
- N:反向的重復前一個查找(與/或?有關);
- g:前進到這個數據的第一行;
- G:前進到這個數據的最后一行去(注意大小寫);
- q:離開less這個程序。
查看文件內容還可以進行查找的操作,看,less是否很不錯?其實less還有很多的功能,詳細的你是否會覺得 less 使用的畫面與環境與man page非常類似?
????????沒錯,因為man這個命令就是詢用less來顯示說明文件的內容,現在你是否覺得less很重要?
使用方式請使用man less查詢一下。
3.數據截取
我們可以將輸出的數據作一個最簡單的截取,那就是取出文件前面幾行(head)或取出后面幾行(tail)文字的功能。
不過,要注意的是head與tail都是以“行”為單位來進行數據截取的。
3.1.head(取出前面幾行)
- head [-n number]文件
選項與參數:
- -n:后面接數字,代表顯示幾行的意思。
?默認的情況中,顯示前面十行,若要顯示前 20行,就得要這樣。
范例:如果后面 100行的數據都不打印,只打印/etc/man_db.conf的前面幾行,該如何是好?
????????head的英文意思就是“頭”,那么這個東西的用法自然就是顯示出一個文件的前幾行,沒錯,就是這樣。
若沒有加上-n這個選項時,默認只顯示十行,若只要一行?那就加入“head-n 1 filename”即可。
????????另外那個-n選項后面的參數較有趣,如果接的是負數,例如上面范例的-n -100時,代表列出前面所有行數,但不包括后面 100行。舉例來說CentOS 7.1的 /etc/man_db.conf 共有131行,則上述的命令“head-n-100 /etc/man_db.conf”就會列出前面31行,后面100行不會打印出來了。這樣說,比較容易懂了吧?
3.1.tail(取出后面幾行)
選項與參數:
- -n:后面接數字,代表顯示幾行的意思。
- -f:表示持續刷新顯示后面所接文件中的內容,要等到按下[ctrl]-c才會結束
默認的情況中,顯示最后的十行。若要顯示最后的20行,就得要這樣:
范例一:如果不知道/etc/man db,conf有幾行,卻只想列出100行以后的數據時?
范例二:持續檢測/var/log/messages的內容
要等到輸入[crtl]-c之后才會結束執行tail這個命令.
????????有head自然就有tail(尾巴),沒錯,這個tail的用法跟head的用法類似,只是顯示的是后面
幾行。默認也是顯示十行,若要顯示非十行,就加-n number的選項即可。
????????范例一的內容就有趣啦,其實與head-n-xx有異曲同工之妙。當執行 tail -n +100 /etc/man db.conf 代表該文件從100行以后都會被列出來,同樣,在man_db.conf共有131行,因此第100-131行就會被列出來,前面的99行都不會被顯示出來。
????????至于范例二中,由于/var/log/messages隨時會有數據寫入,你想要讓該文件有數據寫入時就立刻顯示到屏幕上,就利用-f這個選項,它可以一直刷新顯示/var/log/messages這個文件,新加入的數據都會被顯示到屏幕上,直到你按下[crtl]-c才會結束 tail 這個命令的執行,由于messages必須要 root權限才能看,所以該范例得要使用root來查詢。
例題
假如我想要顯示/etc/man_db.conf的第11到第20行?
????????答:這個應該不算難,想一想,在第11到第20行,那么我取前20行,再取后十行,所以結果就是:【head -n 20 /etc/man_db.conf | tail -n 10】,這樣就可以得到第11到第20行之間的內容了。
????????這兩個命令中間有個管道(|)的符號存在,這個管道的意思是:前面的命令所輸出的信息,通過管道交由后續的命令繼續使用。所以,head-n20/etc/man_db.conf會將文件內的20行取出來,但不輸出到屏幕上,而是轉交給后續的tai 命令繼續處理。因此 tal不需要接文件名,因為tai 所需要的數據是來自于head處理后的結果
例題
????????承上一題,那如果我想要列出正確的行號?就是屏幕上僅列出letc/man_db.conf的第11到第20行,且有行號存在?????????答:我們可以通過 cat-n來顯示出行號,然后再通過head/tail 來截取數據即可,所以就變成了如下的模樣:【cat -n /etc/man db.conf | head -n 20 | tail -n 10】
有沒有頭暈呢?
4.非純文本文件:od
我們上面提到的都是在查看純文本文件的內容。那么萬一我們想要查看非文本文件呢??
舉例來說,例如/usr/bin/passwd這個執行文件的內容時,又該如何去讀出信息呢?
????????事實上,由于執行文件通常是二進制文件(binary file),使用上面提到的命令來讀取它的內容時,確實會產生類似亂碼的數據。那怎么辦?
沒關系,我們可以利用od 這個命令來讀取。
- od[-t TYPE]文件
選項或參數:
-t:后面可以接各種【類型(TYPE)】的輸出,例如:
- a :利用默認的字符來輸出;
- c? :使用ASCII字符來輸出;
- d[size]:利用十進制(decimal)來輸出數據,每個整數占用size Bytes;
- f[sizel:利用浮點數值(floating)來輸出數據,每個數占用size Bytes;
- o[size]:利用八進制(octa1)來輸出數據,每個整數占用 size Bytes;
- x[size]:利用十六進制(hexadecimal)來輸出數據,每個整數占用size Bytes;
范例一:請將/usr/bin/passwd的內容使用ASCII方式來顯示。
?……(后面省略)……
最左邊第一列是以八進制來表示Bytes數.
以上面范例來說,第二欄0000020代表開頭是第16個byte(2x8)的內容之意。
范例二:請將/etc/issue這個文件的內容以八進制列出存儲值與ASCII的對照表。
如上所示,可以發現每個字符可以對應到的數值是什么。要注意的是,該數值是八進制.例如S對應的記錄數值為123,轉成十進制:1x8^2+2x8+3=83.
????????利用這個命令,可以將數據文件(data file)或是二進制文件(binary file)的內容數據讀出來雖然讀出來的數值默認是使用非文本文件,亦即是十六進制的數值來顯示,不過,我們還是可以通過-t c的選項與參數來將數據內的字符以ASCII類型的字符來顯示,雖然對于一般用戶來說,這個命令的用處可能不大,但是對于工程師來說,這個命令可以將二進制文件(binary file)的內容作一個大致的輸出,他們可以看得出其中的意義。
????????如果對純文本文件使用這個命令,你甚至可以發現ASCII與字符的對照表,非常有趣,例如上述的范例二,你可以發現到每個英文字S對照到的數字都是123,轉成十進制你就能夠發現那是83。
????????如果你有任何程序語言的書,拿出來對照一下ASCII的對照表,就能夠發現真是正確。
我不想查Google,想要立刻找到password 這幾個字的ASCI對照,該如何通過od來判斷?
????????答:其實可以通過剛剛上一個小節談到的管道命令來處理。如下所示:
【echo password | od -t oCc】
echo可以在屏幕上面顯示任何信息,而這個信息不由屏幕輸出,而是傳給od去繼續處理,就可以得到ASCIl code對照。