Linux最重要的哲學思想就是:一切皆文件。可見文件及文件操作在Linux當中是多麼的重要。在Linux系統中我們也會經常用到各種文本文件處理的操作,熟練使用這些小巧精悍的文本處理工具,在關鍵時刻往往展現非凡的神奇功效。
Linux哲學中, 為了更好的組合各種命令達到更加強大的功能, 大多數文本處理命令的輸入既可以是文件, 也可以是標准輸入, 如果沒有指定輸入文件, 則默認從標准輸入讀數據. 輸出都是標准輸出, 方面傳給管道線的下一個命令, 想要輸出到文件的話, 重定向下即可. 下面介紹的這些命令, 如無特殊說明, 則都可以從文件或者標准輸入讀入數據。
cat
cat命令的用途是連接文件或標准輸入並打印。這個命令常用來顯示文件內容,或者將幾個文件連接起來顯示,或者從標准輸入讀取內容並顯示,它常與重定向符號配合使用。
1.命令格式:
cat [選項] [文件]...
2.命令功能:
cat主要有三大功能:
1.一次顯示整個文件:cat filename
2.從鍵盤創建一個文件:cat > filename 只能創建新文件,不能編輯已有文件.
3.將幾個文件合並為一個文件:cat file1 file2 > file
3.命令參數:
-A, --show-all 等價於 -vET -b, --number-nonblank 對非空輸出行編號 -e 等價於 -vE -E, --show-ends 在每行結束處顯示 $ -n, --number 對輸出的所有行編號,由1開始對所有輸出的行數編號 -s, --squeeze-blank 有連續兩行以上的空白行,就代換為一行的空白行 -t 與 -vT 等價 -T, --show-tabs 將跳格字符顯示為 ^I -u (被忽略) -v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外
4.使用實例:
實例一:把 log2012.log 的文件內容加上行號後輸入 log2013.log 這個文件裡
命令:
cat -n log2012.log log2013.log
輸出:
[root@localhost test]# cat log2012.log 2012-01 2012-02 ====== [root@localhost test]# cat log2013.log 2013-01 2013-02 2013-03 ====== [root@localhost test]# cat -n log2012.log log2013.log 1 2012-01 2 2012-02 3 4 5 ====== 6 2013-01 7 2013-02 8 9 10 2013-03 11 ======
說明:
實例二:把 log2012.log 和 log2013.log 的文件內容加上行號(空白行不加)之後將內容附加到 log.log 裡。
命令:
cat -b log2012.log log2013.log log.log
輸出:
[root@localhost test]# cat -b log2012.log log2013.log log.log 1 2012-01 2 2012-02 3 ====== 4 2013-01 5 2013-02 6 2013-03 7 ======
實例三:把 log2012.log 的文件內容加上行號後輸入 log.log 這個文件裡
命令:
輸出:
[root@localhost test]# cat log.log [root@localhost test]# cat -n log2012.log > log.log [root@localhost test]# cat -n log.log 1 2012-01 2 2012-02 3 4 5 ======
實例四:使用here doc來生成文件
輸出:
[root@localhost test]# cat >log.txt <<EOF > Hello > World > Linux > PWD=$(pwd) > EOF [root@localhost test]# ls -l log.txt -rw-r--r-- 1 root root 37 10-28 17:07 log.txt [root@localhost test]# cat log.txt Hello World Linux PWD=/opt/soft/test [root@localhost test]#
說明:
注意粗體部分,here doc可以進行字符串替換。
備注:
tac (反向列示)
命令:
tac log.txt
輸出:
[root@localhost test]# tac log.txt PWD=/opt/soft/test Linux World Hello
說明:
tac 是將 cat 反寫過來,所以他的功能就跟 cat 相反, cat 是由第一行到最後一行連續顯示在螢幕上,而 tac 則是由最後一行到第一行反向在螢幕上顯示出來!
rev (reverse)
這個命令和cat也是反的, 不過它不像tac那樣, 它輸出行的順序和cat也是一樣的, 不過輸出每行的時候, 先輸出最後一個字符, 接著是倒數第二個字符, 最後才是第一個字符, 下面這個命令可以把輸入全部倒過來:
[root@bash ~]# cat re one apple a day! two apple two day! [root@bash ~]# rev re !yad a elppa eno !yad owt elppa owt
nl (number lines)
nl命令在linux系統中用來計算文件中行號。nl 可以將輸出的文件內容自動的加上行號!其默認的結果與 cat -n 有點不太一樣, nl 可以將行號做比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能。
1.命令格式:
nl [選項]... [文件]...
2.命令參數:
-b :指定行號指定的方式,主要有兩種: -b a :表示不論是否為空行,也同樣列出行號(類似 cat -n); -b t :如果有空行,空的那一行不要列出行號(默認值); -n :列出行號表示的方法,主要有三種: -n ln :行號在螢幕的最左方顯示; -n rn :行號在自己欄位的最右方顯示,且不加 0 ; -n rz :行號在自己欄位的最右方顯示,且加 0 ; -w :行號欄位的占用的位數。 -p 在邏輯定界符處不重新開始計算。
3.命令功能:
nl 命令讀取 File 參數(缺省情況下標准輸入),計算輸入中的行號,將計算過的行號寫入標准輸出。 在輸出中,nl 命令根據您在命令行中指定的標志來計算左邊的行。 輸入文本必須寫在邏輯頁中。每個邏輯頁有頭、主體和頁腳節(可以有空節)。 除非使用 -p 標志,nl 命令在每個邏輯頁開始的地方重新設置行號。 可以單獨為頭、主體和頁腳節設置行計算標志(例如,頭和頁腳行可以被計算然而文本行不能)。
4.使用實例:
實例一:用 nl 列出 log2012.log 的內容
命令:
nl log2012.log
輸出:
[root@localhost test]# nl log2012.log 1 2012-01 2 2012-02 3 ======
說明:
文件中的空白行,nl 不會加上行號
實例二:用 nl 列出 log2012.log 的內容,空本行也加上行號
命令:
nl -b a log2012.log
輸出:
[root@localhost test]# nl -b a log2012.log 1 2012-01 2 2012-02 3 4 5 ======[root@localhost test]#
實例3:讓行號前面自動補上0,統一輸出格式
命令:nl -b a -n rz log2014.log
輸出:
[root@localhost test]# nl -b a -n rz log2014.log 000001 2014-01 000002 2014-02 000003 2014-03
more
more命令,功能類似 cat ,cat命令是整個文件的內容從上到下顯示在屏幕上。 more會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,而且還有搜尋字串的功能 。more命令從前向後讀取文件,因此在啟動時就加載整個文件。
1.命令格式:
more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ]
2.命令功能:
more命令和cat的功能一樣都是查看文件裡的內容,但有所不同的是more可以按頁來查看文件的內容,還支持直接跳轉行等功能。
3.命令參數:
+n 從笫n行開始顯示 -n 定義屏幕大小為n行 +/pattern 在每個檔案顯示前搜尋該字串(pattern),然後從該字串前兩行之後開始顯示 -c 從頂部清屏,然後顯示 -d 提示“Press space to continue,’q’ to quit(按空格鍵繼續,按q鍵退出)”,禁用響鈴功能 -l 忽略Ctrl+l(換頁)字符 -p 通過清除窗口而不是滾屏來對文件進行換頁,與-c選項相似 -s 把連續的多個空行顯示為一行 -u 把文件內容中的下畫線去掉
4.常用操作命令:
Enter 向下n行,需要定義。默認為1行 Ctrl+F 向下滾動一屏 空格鍵 向下滾動一屏 Ctrl+B 返回上一屏 = 輸出當前行的行號 :f 輸出文件名和當前行的行號 V 調用vi編輯器 !命令 調用Shell,並執行命令 q 退出more
5.命令實例:
實例1:顯示文件中從第3行起的內容
命令:
more +3 log2012.log
輸出:
[root@localhost test]# cat log2012.log 2012-01 2012-02 2012-03 2012-04-day1 2012-04-day2 2012-04-day3 ====== [root@localhost test]# more +3 log2012.log 2012-03 2012-04-day1 2012-04-day2 2012-04-day3 ======
實例2:從文件中查找第一個出現"day3"字符串的行,並從該處前兩行開始顯示輸出
命令:
more +/day3 log2012.log
輸出:
[root@localhost test]# more +/day3 log2012.log ...skipping 2012-04-day1 2012-04-day2 2012-04-day3 2012-05 2012-05-day1 ======
實例3:設定每屏顯示行數
命令:
more -5 log2012.log
輸出:
[root@localhost test]# more -5 log2012.log 2012-01 2012-02 2012-03 2012-04-day1 2012-04-day2
說明:
如下圖所示,最下面顯示了該屏展示的內容占文件總行數的比例,按 Ctrl+F 或者 空格鍵 將會顯示下一屏5條內容,百分比也會跟著變化。
less
less 工具也是對文件或其它輸出進行分頁顯示的工具,應該說是linux正統查看文件內容的工具,功能極其強大。less 的用法比起 more 更加的有彈性。在 more 的時候,我們並沒有辦法向前面翻, 只能往後面看,但若使用了 less 時,就可以使用 [pageup] [pagedown] 等按鍵的功能來往前往後翻看文件,更容易用來查看一個文件的內容!除此之外,在 less 裡頭可以擁有更多的搜索功能,不止可以向下搜,也可以向上搜。
1.命令格式:
less [參數] 文件
2.命令功能:
less 與 more 類似,但使用 less 可以隨意浏覽文件,而 more 僅能向前移動,卻不能向後移動,而且 less 在查看之前不會加載整個文件。
3.命令參數:
-b <緩沖區大小> 設置緩沖區的大小 -e 當文件顯示結束後,自動離開 -f 強迫打開特殊文件,例如外圍設備代號、目錄和二進制文件 -g 只標志最後搜索的關鍵詞 -i 忽略搜索時的大小寫 -m 顯示類似more命令的百分比 -N 顯示每行的行號 -o <文件名> 將less 輸出的內容在指定文件中保存起來 -Q 不使用警告音 -s 顯示連續空行為一行 -S 行過長時間將超出部分捨棄 -x <數字> 將“tab”鍵顯示為規定的數字空格 /字符串:向下搜索“字符串”的功能 ?字符串:向上搜索“字符串”的功能 n:重復前一個搜索(與 / 或 ? 有關) N:反向重復前一個搜索(與 / 或 ? 有關) b 向後翻一頁 d 向後翻半頁 h 顯示幫助界面 Q 退出less 命令 u 向前滾動半頁 y 向前滾動一行 空格鍵 滾動一行 回車鍵 滾動一頁 [pagedown]: 向下翻動一頁 [pageup]: 向上翻動一頁
注:less可同時查看多個文件使用n或者p進行切換
head
1.命令格式:
head [參數]... [文件]...
2.命令功能:
head 用來顯示檔案的開頭至標准輸出中,默認head命令打印其相應文件的開頭10行。
3.命令參數:
-q 隱藏文件名 -v 顯示文件名 -c<字節> 顯示字節數 -n<行數> 顯示的行數
4.使用實例:
實例1:顯示文件的前n行
命令:
head -n 5 log2014.log
輸出:
[root@localhost test]# cat log2014.log 2014-01 2014-02 2014-03 2014-04 2014-05 2014-06 2014-07 2014-08 2014-09 2014-10 2014-11 2014-12 ============================== [root@localhost test]# head -n 5 log2014.log 2014-01 2014-02 2014-03 2014-04 2014-05
實例2:顯示文件前n個字節
命令:
head -c 20 log2014.log
輸出:
[root@localhost test]# head -c 20 log2014.log 2014-01 2014-02 2014
實例3:文件的除了最後n個字節以外的內容
命令:
head -c -32 log2014.log
輸出:
[root@localhost test]# head -c -32 log2014.log 2014-01 2014-02 2014-03 2014-04 2014-05 2014-06 2014-07 2014-08 2014-09 2014-10 2014-11 2014-12
實例4:輸出文件除了最後n行的全部內容
命令:
head -n -6 log2014.log
輸出:
[root@localhost test]# head -n -6 log2014.log 2014-01 2014-02 2014-03 2014-04 2014-05 2014-06 2014-07
tail
tail 命令從指定點開始將文件寫到標准輸出.使用tail命令的-f選項可以方便的查閱正在改變的日志文件,tail -f filename會把filename裡最尾部的內容顯示在屏幕上,並且不但刷新,使你看到最新的文件內容.
1.命令格式:
tail[必要參數][選擇參數][文件]
2.命令功能:
用於顯示指定文件末尾內容,不指定文件時,作為輸入信息進行處理。常用查看日志文件。
3.命令參數:
-f 循環讀取 -q 不顯示處理信息 -v 顯示詳細的處理信息 -c<數目> 顯示的字節數 -n<行數> 顯示行數 --pid=PID 與-f合用,表示在進程ID,PID死掉之後結束. -q, --quiet, --silent 從不輸出給出文件名的首部 -s, --sleep-interval=S 與-f合用,表示在每次反復的間隔休眠S秒
4.使用實例:
實例1:顯示文件末尾內容
命令:
tail -n 5 log2014.log
輸出:
[root@localhost test]# tail -n 5 log2014.log 2014-09 2014-10 2014-11 2014-12 ==============================
說明:
顯示文件最後5行內容
實例2:循環查看文件內容
命令:
tail -f test.log
輸出:
[root@localhost ~]# ping 192.168.120.204 > test.log & [1] 11891[root@localhost ~]# tail -f test.log PING 192.168.120.204 (192.168.120.204) 56(84) bytes of data. 64 bytes from 192.168.120.204: icmp_seq=1 ttl=64 time=0.038 ms 64 bytes from 192.168.120.204: icmp_seq=2 ttl=64 time=0.036 ms 64 bytes from 192.168.120.204: icmp_seq=3 ttl=64 time=0.033 ms 64 bytes from 192.168.120.204: icmp_seq=4 ttl=64 time=0.027 ms 64 bytes from 192.168.120.204: icmp_seq=5 ttl=64 time=0.032 ms 64 bytes from 192.168.120.204: icmp_seq=6 ttl=64 time=0.026 ms 64 bytes from 192.168.120.204: icmp_seq=7 ttl=64 time=0.030 ms 64 bytes from 192.168.120.204: icmp_seq=8 ttl=64 time=0.029 ms 64 bytes from 192.168.120.204: icmp_seq=9 ttl=64 time=0.044 ms 64 bytes from 192.168.120.204: icmp_seq=10 ttl=64 time=0.033 ms 64 bytes from 192.168.120.204: icmp_seq=11 ttl=64 time=0.027 ms
說明:
ping 192.168.120.204 > test.log &
//在後台ping遠程主機。並輸出文件到test.log;這種做法也使用於一個以上的檔案監視。用Ctrl+c來終止。
實例3:從第5行開始顯示文件
命令:
tail -n +5 log2014.log
輸出:
[root@localhost test]# cat log2014.log 2014-01 2014-02 2014-03 2014-04 2014-05 2014-06 2014-07 2014-08 2014-09 2014-10 2014-11 2014-12 ============================== [root@localhost test]# tail -n +5 log2014.log 2014-05 2014-06 2014-07 2014-08 2014-09 2014-10 2014-11 2014-12 ==============================
hexdump
hexdump用來查看二進制文件。
1.命令格式:
hexdump [options] file...
2.命令參數:
-b 單字節八進制顯示,十六進制顯示偏移量,每行顯示16個字符,每字符用三位顯示,不足補零,列間以空格分隔 -c 單字節字符顯示,十六進制顯示偏移量,每行顯示16個字符,每字符三位顯示,不足補空格,列間以空格分隔 -C 標准十六進制+ascii碼顯示,十六進制顯示偏移量,每行16個字符,每字符兩位顯示,不足補0,結尾顯示當前16位數據的ascii碼值,以|框住 -d 雙字節十進制顯示,十六進制顯示偏移量,每行8組(16字節)每組5位,不足補零,列間以空格分隔,以無符號10進制數值顯示 -e format_string 以指定的格式顯示 -f format_file 根據format file中的格式進行輸出,忽略formatfile中空行及以#開始的行 -n length 只顯示length個字節的數據 -o 雙字節八進制顯示。十六進制顯示偏移量,每行8組數據,每數據占兩字節,6列,不足補零,以空格分隔 -s offset 跳過從開始的offset個字節,默認輸入十進制,以0x或0X開始按16進制處理,否則如以0開始按八進制處理,如果以b/k/m結尾,則原數值乘以512/1024/1048576 -v 顯示所有數據,如果不包含這一選項,對於同上一行完全相同的數據,hexdump會以*代替顯示 -x 兩位十六進制顯示.十六進制顯示偏移量,每行8組數據,每數據占兩字節,4列,不足補零,以空格分隔 -e 指定格式字符串,格式字符串包含在一對單引號中,格式字符串形如: 'a/b "format1" "format2"' 每個格式字符串由三部分組成,每個由空格分隔,第一個形如a/b,b表示對每b個輸入字節應用format1格式,a表示對每a個輸入字節應用format2格式,一般a>b,且b只能為1,2,4,另外a可以省略,省略則a=1。 format1和format2中可以使用類似printf的格式字符串,如: %02d:兩位十進制 %03x:三位十六進制 %02o:兩位八進制 %c:單個字符等
3.實例:
[root@bash ~]# hexdump -n10 -v -C -s 10 /bin/cat 0000000a 00 00 00 00 00 00 02 00 3e 00 |........>.| 00000014