如何在 Linux 中使用 wc 命令

已發表: 2022-07-23
顯示 bash 提示符的 Linux 筆記本電腦
fatmawati achmad zaenuri/Shutterstock.com

計算文件中的行數、字數和字節數很有用,但 Linux wc命令的真正靈活性來自與其他命令的配合。 讓我們來看看。

wc 命令是什麼?

wc命令是一個小型應用程序。 它是核心 Linux 實用程序之一,因此無需安裝。 它已經在您的 Linux 計算機上。

你可以用幾句話來描述它的作用。 它計算文件或文件選擇中的行數、字數和字節數,並在終端窗口中打印結果。 它還可以從 STDIN 流中獲取輸入,這意味著您希望它處理的文本可以通過管道傳輸到其中。 這是wc真正開始增加價值的地方。

如何在 Linux 上使用管道
相關如何在 Linux 上使用管道

這是 Linux 口號“做一件事,做好”的一個很好的例子。 因為它接受管道輸入,所以它可以用於多命令咒語。 正如我們將看到的,這個小的獨立實用程序實際上是一個偉大的團隊合作者。

我使用wc的一種方法是在我正在準備的複雜命令或別名中作為佔位符。 如果完成的命令具有破壞性和刪除文件的潛力,我經常使用wc作為真正危險命令的替代。

這樣,在命令的開發過程中,我會得到視覺反饋,表明每個文件都在按預期進行處理。 當我與語法搏鬥時,不可能發生任何不好的事情。

儘管wc很簡單,但您仍然需要了解一些小怪癖。

開始使用 wc

使用wc的最簡單方法是在命令行上傳遞文本文件的名稱。

 wc lorem.txt 

將 wc 與包含一長行文本的文件一起使用

這會導致wc掃描文件併計算行數、字數和字節數,並將它們寫出到終端窗口。

單詞被認為是任何以空格為界的東西。 它們是否是來自真實語言的單詞是無關緊要的。 如果一個文件只包含“frd g lkj”,它仍然算作三個單詞。

行是由回車符或文件結尾終止的字符序列。 該行是否在您的編輯器或終端窗口中環繞並不重要,直到wc遇到回車或文件末尾,它仍然是同一行。

我們的第一個示例在整個文件中找到了一行。 這是“lorem.txt”文件的內容。

 貓 lorem.txt 

一長行的文件內容

所有這些都算作一行,因為沒有回車。 將此與另一個文件“lorem2.txt”進行比較,以及wc如何解釋它。

 wc lorem2.txt
 貓lorem2.txt 

將 wc 與包含多行的文件一起使用

這一次, wc計數 15 行,因為已在文本中插入回車以在特定點開始新行。 但是,如果您計算其中包含文本的行數,您會發現只有 12 行。

其他三行是文件末尾的空白行。 這些僅包含回車符。 儘管這些行中沒有文本,但已經開始了一個新行,因此wc將它們視為此類。

我們可以將任意數量的文件傳遞給wc

 wc lorem.txt lorem2.txt 

將 wc 與兩個文件一起使用

我們得到每個文件的統計數據和所有文件的總數。

我們還可以使用通配符,以便我們可以選擇匹配的文件而不是顯式命名的文件。

 wc *.txt *.? 

將 wc 與通配符一起使用

命令行選項

默認情況下, wc將顯示每個文件中的行、單詞和字節。 這與使用-l (行) -w (字)和-c (字節)選項相同。

 wc lorem.txt
 wc -l -w -c lorem.txt 

將 wc 與行、字和字節選項一起使用

我們可以指定我們希望看到的圖形組合。

 wc -l lorem.txt

wc -w lorem.txt

wc -c lorem.txt

wc -l -c lorem.txt 

將 wc 與選項組合一起使用

應特別注意最後一個數字,由-c (字節)選項生成。 許多人將其誤認為是數字符。 它實際上計算字節數。 字符數和字節數可能相同。 但不總是。

讓我們看一下名為“unicode.txt”的文件的內容。

 貓 unicode.txt 

包含非拉丁字符的文件內容

它包含三個單詞和一個非拉丁字母字符。 我們將讓wc使用其默認設置bytes處理文件,我們將再次執行此操作,但使用-m (字符)選項請求字符

 wc unicode.txt
 wc -l -w -m unicode.txt 

計算文件中的字節數,然後計算同一文件中的字符

字節數多於字符數。

讓我們看一下文件的十六進制轉儲,看看發生了什麼。 hexdump命令的-C (canonical) 選項以 16 行顯示文件中的字節,在行尾顯示它們的純 ASCII 等價物(如果有的話)。 如果沒有對應的 ASCII 字符,一個句點“ . ”改為顯示。

 hexdump -C unicode.txt 

帶有非拉丁字符的短文件的 hexdump

在 ASCII 中,十六進制值0x20表示一個空格字符。 如果我們從左邊數三個值,我們會看到下一個值是一個空格字符。 所以前三個值0x620x6f0x79代表“男孩”中的字母。

跳過0x20 ,我們看到另一組三個十六進制值: 0x630x610x74 。 這些拼出“貓”。 跳過下一個空格字符,我們看到“dog”中字母的另外三個值。 它們是0x640x5f0x67

在“dog”這個詞的後面,我們可以看到一個空格字符0x20和另外五個十六進制值。 最後兩個是回車符0x0a

其他三個字節代表非拉丁字符,我們用綠色圈起來。 它是一個 Unicode 字符,編碼它需要三個字節。 它們是0xe10xaf0x8a

因此,請確保您知道您在計算什麼,並且字節和字符不必相同。 通常,計數字節更有用,因為它可以告訴您文件中的實際內容。 按字符計數可以為您提供文件內容所代表的事物的數量。

相關:什麼是 ANSI 和 Unicode 等字符編碼,它們有何不同?

從文件中獲取文件名

還有另一種方法可以為wc提供文件名。 您可以將文件名放在一個文件中,然後將該文件的名稱傳遞給wc 。 它打開文件,提取文件名,並像在命令行上傳遞它們一樣處理它們。 這允許您存儲任意文件名集合以供重複使用。

但是有一個問題,而且是一個很大的問題。 文件名必須以null結尾,而不是回車終止。 也就是說,在每個文件名之後必須有一個空字節0x00而不是通常的回車字節0x0a

您無法打開編輯器並創建具有此格式的文件。 通常,像這樣的文件是由其他程序生成的。 但是,如果您有這樣的文件,這就是您將如何使用它。

這是我們包含文件名的文件。 在less中打開它會顯示less用來指示空字節的奇怪“ ^@ ”字符。

 更少的源文件-list.txt 

less 中包含空字節的文件

要將文件與wc一起使用,我們需要使用--files0-from (讀取輸入)選項並傳入包含文件名的文件名。

 wc ---files0-from=source-files-list.txt 

wc 處理空終止文件名的文件

這些文件的處理方式與在命令行中提供的方式完全相同。

管道輸入到 wc

將輸入發送到wc的一種更常見、更靈活、更高效的方法是將其他命令的輸出通過管道傳輸到wc中。 我們可以用echo命令來證明這一點。

 echo "幫我算一算" | 廁所
echo -e "給我數這個\n" | 廁所

使用 echo 將輸入發送到 wc

第二個echo命令使用-e (轉義字符)選項來允許轉義序列,如“ \n ”換行格式代碼。 這會注入一個新行,導致wc將輸入視為兩行。

這是一系列命令,將它們的輸入從一個輸入到另一個。

 查找 ./* -type f | 轉 | 切-d'。 -f1 | 轉 | 排序 | 獨特的
  • find從當前目錄開始遞歸查找文件( type -f )。 rev反轉文件名。
  • cut通過將字段分隔符定義為句點來提取第一個字段 ( -f1 ) . ” 並從反向文件名的“前面”讀取到它找到的第一個句點。 我們現在已經提取了文件擴展名。
  • rev反轉提取的第一個字段。
  • sort按字母升序對它們進行排序。
  • uniq列出終端窗口的唯一條目。

當前目錄樹中的唯一擴展名列表

此命令列出當前目錄和任何子目錄中的所有唯一文件擴展名。

如果我們在uniq命令中添加-c (count) 選項,它將計算每種擴展類型的出現次數。 但是,如果我們想知道有多少不同的、唯一的文件擴展名,我們可以將wc作為該行的最後一個命令,並使用-l (行)選項。

 查找 ./* -type f | 轉 | 切-d'。 -f1 | 轉 | 排序 | 獨特 | wc -l 

添加 wc 以計算唯一擴展名

相關:如何使用 Linux cut 命令

最後

這是wc可以為您做的最後一招。 它會告訴你文件中最長行的長度。 可悲的是,它沒有告訴你它是哪條線。 它只是給你長度。

 wc -L taf.c 

使用 wc 獲取文件中最長行的長度

但請注意,製表符被計為八個空格。 在我的編輯器中查看,該行的開頭有三個兩空格製表符。 它的實際長度是 124 個字符。 所以報告的數字是人為擴大的。

我會用一大撮鹽來處理這個功能。 我的意思是不要使用它。 它的輸出具有誤導性。

儘管wc有其怪癖,但當您需要計算各種值(而不僅僅是文件中的單詞)時,它是一個很好的工具,可以放入管道命令。

相關:你應該知道的 37 個重要的 Linux 命令