首頁 > 軟體

Linux之基本文字處理工具

2020-06-16 17:22:06

一.引言

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

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2017-02/140313p2.htm


IT145.com E-mail:sddin#qq.com