跳轉到內容

Ict-創新/LPI/103.2

來自華夏公益教科書,開放的書籍,開放的世界

103.2 使用過濾器處理文字流

[編輯 | 編輯原始碼]

考生應能夠將過濾器應用於文字流。


關鍵知識領域

  • 將文字檔案和輸出流透過文字工具過濾器,以使用 GNU textutils 包中找到的標準 UNIX 命令修改輸出。

文字處理工具

[編輯 | 編輯原始碼]

Linux 擁有豐富的工具集,用於處理和操作文字檔案。在本節中,我們將介紹其中一些工具。

cat - cat 是 concatenate 的縮寫,是一個 Linux 命令,用於將檔案內容寫入標準輸出。cat 通常與其他命令結合使用以執行對檔案操作,或者如果您想快速瞭解檔案內容。

# cat /etc/aliases

cat 可以接受多個引數,最常用的是 -n 和 -b,它們分別對所有行和非空行輸出行號。


headtail - 工具 head 和 tail 通常用於檢查日誌檔案。預設情況下,它們輸出 10 行文字。以下是主要用法。

列出 /var/log/messages 的前 20 行

# head -n 20 /var/log/messages

# head -20 /var/log/messages


列出 /etc/aliases 的最後 20 行

# tail -20 /etc/aliases

tail 工具還有一個額外的選項,允許您從給定行開始列出文字的末尾。


/var/log/messages 中的第 25 行開始列出文字

# tail +25 /etc/log/messages

最後,tail 可以使用 -f 選項連續讀取檔案。例如,當您檢查即時日誌檔案時,這非常有用。


wc - wc 工具計算檔案中的位元組單詞數。多個選項允許您控制 wc 的輸出。

wc 的選項
-l 計算行數
-w 計算單詞數
-c 或 -m 計算位元組數或字元數


nl - nl 工具與 cat -b 的輸出相同

對所有行(包括空白行)進行編號

# nl -ba /etc/lilo.conf


僅對包含文字的行進行編號

# nl -bt /etc/lilo.conf


expand/unexpand - expand 命令用於將 TAB 替換為空格。您也可以使用 unexpand 執行相反的操作。

od 有一些工具可用於此目的。最常見的是 od(八進位制轉儲)和 hexdump。

split - 拆分檔案 - split 工具可以根據大小或行數等標準將檔案拆分成更小的檔案。例如,我們可以將 /etc/passwd 拆分成包含 5 行的更小的檔案

# split -l 5 /etc/passwd

這將建立名為 xaaxabxacxad ... 的檔案,每個檔案至少包含 5 行。可以在命令列中為檔案提供更有意義的字首名稱(而不是 x),例如 passwd-5.

# split -l 5 /etc/passwd passwd-5

這將建立與上述檔案(aaxabxacxad ...)相同的檔案,但名稱現在是 passwd-5aapasswd-5abpasswd-5acpasswd-5ad


刪除連續的重複行

uniq 工具只會將連續的相同行的副本傳送到 stdout。

考慮以下示例

# uniq > /tmp/UNIQUE

第 1 行

第 2 行

第 2 行

第 3 行

第 3 行

第 3 行

第 1 行

^D


/tmp/UNIQUE 檔案具有以下內容

# cat /tmp/UNIQUE

第 1 行

第 2 行

第 3 行

第 1 行


注意:從上面的示例中我們可以看到,當使用 uniq 時,非連續的相同行仍然會列印到 STDOUT。通常,輸出會先排序,以便所有相同的行都出現在一起。

# sort | uniq > /tmp/UNIQUE

cut cut 工具可以從文字每一行的字元或欄位中提取一個範圍。–c 選項用於根據字元位置進行切割。

語法

cut {range1,range2}

示例

# cut –c5-10,15- /etc/password


上面的示例對 /etc/password 中的每一行輸出第 5 到 10 個字元和第 15 個字元到行尾。您也可以指定檔案的欄位分隔符(空格、逗號等),以及要輸出的欄位。這些選項分別使用 –d–f 標誌設定。

語法

{delimiter} -f {fields}

示例

# cut -d: -f 1,7 --output-delimiter=" " /etc/passwd

這將輸出 /etc/passwd 的第 1 和 7 個欄位,並用空格分隔。預設的 output-delimiter 與原始輸入分隔符相同。--output-delimiter 選項允許您更改它。

paste/join - 最簡單的工具是 paste它將兩個檔案並排連線在一起。

語法

paste text1 text2

使用 join,您可以進一步指定要考慮的欄位。

語法

join -j1 {field_num} -j2{field_num} text1 text2

join -1 {field_num} -2{field_num} text1 text2

只有當指定欄位匹配時,文字才會被髮送到 stdout。比較是一次進行一行,一旦沒有匹配項,程序就會停止,即使檔案末尾還有更多匹配項。

sort - 預設情況下,sort 將以字母順序排列文字。要執行數字排序,請使用 -n 選項。

使用 fmt 和 pr 格式化輸出

[編輯 | 編輯原始碼]

fmt 是一種簡單的文字格式化工具,它可以將文字重新格式化為指定長度的行。

您可以使用 fmt 修改每行輸出的字元數。預設情況下,fmt 將連線行並輸出 75 個字元的行。

fmt 選項

-w 每行的字元數

-s 拆分長行,但不要重新填充

-u 在每個單詞之間放置一個空格,在句末放置兩個空格

可以使用 pr 工具將長檔案分頁,以適應給定大小的紙張。文字被分成指定長度的頁面,並新增頁面頁首。您可以控制頁面長度(預設值為 66 行)和頁面寬度(預設值為 72 個字元),以及列數。


pr 也可以生成多列輸出。

當將文字輸出到多列時,每列將被均勻地截斷到定義的頁面寬度。這意味著字元會被刪除,除非原始文字被編輯以避免這種情況。


tr tr 工具將一組字元轉換為另一組字元。

將大寫字母更改為小寫字母的示例

tr 'A-B' 'a-b' < file.txt


替換 /etc/passwd 中的分隔符

# tr ':' ' ' < /etc/passwd


注意tr 只有兩個引數!。


sed sed 代表流編輯器,用於操作文字流。tr 不會從檔案中讀取,它只讀取標準輸入。它最常用於轉換 bash 指令碼中其他命令生成的文字輸入。sed 是一種複雜的工具,需要一定時間才能掌握。它最常見的用例是在輸入流中查詢和替換文字。sed 的輸出寫入標準輸出,原始檔案保持不變,並且需要重定向到檔案才能使更改永久生效。

命令

# sed ‘s/linux/Linux/g‘ readme.txt > ReadMe.txt

將在 readme.txt 檔案中將 linux 替換為 Linux。命令末尾的 g 用於使替換全域性生效,因此 sed 將處理整行,而不是在第一次出現 linux 時停止。有關 sed 的更多資訊,請參閱 103.7 節。



使用的檔案、術語和工具:* cat

  • cut
  • expand
  • fmt
  • head
  • od
  • join
  • nl
  • paste
  • pr
  • sed
  • sort
  • split
  • tail
  • tr
  • unexpand
  • uniq
  • wc


上一章 | 下一章

華夏公益教科書