Ict-創新/LPI/103.2
考生應能夠將過濾器應用於文字流。
關鍵知識領域
- 將文字檔案和輸出流透過文字工具過濾器,以使用 GNU textutils 包中找到的標準 UNIX 命令修改輸出。
Linux 擁有豐富的工具集,用於處理和操作文字檔案。在本節中,我們將介紹其中一些工具。
cat - cat 是 concatenate 的縮寫,是一個 Linux 命令,用於將檔案內容寫入標準輸出。cat 通常與其他命令結合使用以執行對檔案操作,或者如果您想快速瞭解檔案內容。
|
# cat /etc/aliases |
cat 可以接受多個引數,最常用的是 -n 和 -b,它們分別對所有行和非空行輸出行號。
head 和 tail - 工具 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 的輸出。
| -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 |
這將建立名為 xaa、xab、xac、xad ... 的檔案,每個檔案至少包含 5 行。可以在命令列中為檔案提供更有意義的字首名稱(而不是 x),例如 passwd-5.
|
# split -l 5 /etc/passwd passwd-5 |
這將建立與上述檔案(aa、xab、xac、xad ...)相同的檔案,但名稱現在是 passwd-5aa、passwd-5ab、passwd-5ac、passwd-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 是一種簡單的文字格式化工具,它可以將文字重新格式化為指定長度的行。
您可以使用 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