歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> 使用 UNIX 進行文本處理

使用 UNIX 進行文本處理

日期:2017/2/28 10:23:39   编辑:Unix基礎知識
UNIX® 起源於簡單的文本處理,並且在它的命令行環境中保留了功能最強大的文本處理工具之一。通過將一系列簡單的命令組合在一起,可以完成復雜的文本轉換,UNIX 提供的工具允許您構建幾乎任何所需的文本處理引擎。

引言

在 UNIX® 誕生之初,人們不大熟悉這種新的操作系統,但他們很快找到了適當的切入點,大學中的研究人員需要一種像樣的文本處理環境。因為在那個時候,計算機的處理速度和內存容量有限,所以程序必須很小,並且相對比較簡單。這樣就產生了 UNIX 中著名的設計思想:“一組工具協同工作,以便完成一項任務”。通過 UNIX 管道將幾種很小的、但功能強大的文本處理工具組合在一起,可以對文本進行各種方式的轉換和操作。

在本文中,您將簡要了解從文件和程序中獲得文本、使用 tr 命令對其進行簡單的轉換、使用 sed 命令進行復雜的搜索和替換操作。然後,您將使用 Perl 編程和腳本語言再次完成這些操作,這樣一來您就可以認識到,Perl 的功能非常強大,它可以替代 tr 和 sed 命令。

開始之前

如果您希望按照本文中的示例進行實驗,請確保您可以使用 UNIX 命令行環境。這可能是本地計算機中的終端模擬程序(在現代桌面中通常稱為 終端,如果您習慣使用 Windows®,那麼可以使用 Cygwin)、或通過 SSH 訪問的遠程系統。

本文的示例所使用的 Shell 語法適用於 GNU Bash,有關需要使用的特定語法,請參考您的 Shell 手冊(或者可以考慮使用 Bash)。

對文本進行各種操作

在開始使用 UNIX 的各種文本實用程序操作文本之前,需要了解如何獲得文本。並且在進行這項工作之前,需要了解 UNIX 的標准輸入/輸出 (I/O) 流。

標准 C 庫(因而,每個 UNIX 程序)定義了三種標准流:輸入、輸出和錯誤。有時將它們稱為 stdin、stdout 和 stderr,這是在所有 C 程序中用來表示它們的全局變量。

當您在 Shell 中使用 > 操作符將程序輸出重定向到文件時,就可以將它的標准輸出 (stdout) 流發送到這個文件。例如:ls > this-dir 將 ls 的輸出發送到一個名為 this-dir 的文件。

當您在 Shell 中使用 < 操作符將程序輸入重定向到文件時,就可以將該文件中的內容輸入到該程序的標准輸入 (stdin) 流。例如:sort < this-dir 可以從名為 this-dir 的文件中讀取內容,並將其作為 sort 命令的輸入。

另一個常用於重定向標准流的操作符是“|”(管道)操作符,它可以將左側程序的標准輸出流連接到右側程序的標准輸入流。例如:ls | sort 和前面的兩個示例完成相同的任務,並且無需臨時文件,ls 的輸出直接進入 sort 命令。

如果您仔細觀察,那麼可能會發現,前面的這些示例中並沒有出現標准錯誤 (stderr) 流。與標准輸出流一樣,可以對 stderr 進行重定向或使用管道進行傳輸,但是您需要告訴 Shell 您希望處理 stderr 而不是 stdout。

可以使用 2> 操作符將標准錯誤流重定向到文件。在處理生成有用的錯誤輸出的命令時,您經常會看到這個操作符,比如用於編譯 UNIX 程序的 make 工具:make 2> build-errors。

這個命令運行了 make,並將任何錯誤信息發送到 build-errors 文件。與之類似,您可以使用 2| 將 stderr 通過管道傳遞到另一個程序。

如果您對具體的細節感興趣,那麼其他的流也有與之對應的數字,盡管很少使用到它們(0 表示標准輸入,1 表示標准輸出),除了在一個非常常見的操作符中。在清單 1 所示的示例中,2>&1 操作符將標准錯誤流連接 到標准輸出流。與 > 操作符組合在一起,您可以使 stderr 和 stdout 輸出到相同的文件中。


清單 1. 將標准錯誤流連接到標准輸出流
make > build-output 2>&1
      

命令

有兩個常用來生成文本輸出的標准 UNIX 命令:cat 和 echo。

cat 命令讀取參數中指定的每個文件,並將這些文件的內容寫入到 stdout。echo 命令將其參數寫入到 stdout。您常常會發現它們作為更復雜的命令管道中的一部分(請參見清單 2)。


清單 2. 使用 cat 和 echo
cat file1 file2 ... filen
echo arguments...
      

但如果您只需要文件中開頭的部分或結尾的部分,那又應該如何呢?cat 有兩種可用來完成這種任務的變種,稱為 head 和 tail(請參見清單 3),它們分別可以顯示開頭的或結尾的 10 行內容,您可以使用 -n 選項為它們指定不同的行數。
清單 3. 使用 head 和 tail
head file1 file2 ... filen
tail file1 file2 ... filen
      

tail 命令還有一個有用的選項 -f (follow)。該選項告訴 tail 打印指定文件的最後 10 行,但是它不僅打印已有的內容,還會等待該文件中將要出現的更多內容,並對其進行打印。您可以使用該選項接著 顯示錯誤日志中的輸出,例如,要在將錯誤寫入到日志的同時查看這些錯誤。

Copyright © Linux教程網 All Rights Reserved