歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux之基本文本處理工具

Linux之基本文本處理工具

日期:2017/2/28 13:43:47   编辑:Linux教程

一.引言

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
Copyright © Linux教程網 All Rights Reserved