計算檔案中的行數而不計算空白行

計算檔案中的行數而不計算空白行

假設有一個包含 7 行的檔案。例如:

a
b
c
#

d
e

當我運行時,grep -c '#' -c -v filenamehere 它給了我 6 行。

我希望它顯示 5 行以消除空白。

答案1

你的文件有行,但您想要計算非空且不以 開頭的行#

$ grep -c '^[^#]' file
5

這會計算開頭包含非字元的行數#

該表達式[^#]匹配不是 的單一字元#。完整表達式與行開頭的^[^#]非匹配。#

空白行與此表達式不匹配,以#¹ 開頭的行也不匹配。

如果您只想計算非空白行:

$ grep -c '.' file
6

這會計算至少包含一個字元的行。


為了完整起見,計算空白行數:

$ grep -c -v '.' file
1

要計算空白行或以 開頭的行#

$ grep -c -v '^[^#]' file
2

請注意,-c-v都是“全局”選項。grep當它們在命令列上給出時,它們會改變整個操作的行為。指定-c-v多次是沒有意義的,而且它們不接受選項參數。

另請注意,如果您在所有選項之後除第一個參數之外的任何位置指定模式或正規表示式,請使用-e 'pattern'以便grep知道這是您要搜尋的模式。也就是說,使用

grep -e '.' -c -v file

或者

grep -c -e '.' -v file

或者

grep -c -v '.' file

GNUgrep將重新排列命令列,使選項出現在路徑名操作數之前(除非POSIXLY_CORRECT在環境中設定),但您通常希望編寫適用於任何grep實作的可移植 shell 程式碼。


在大多數實作中,以非字元(恰好在使用者區域設定字元對應中不形成有效字元的位元組序列)開頭的行也將被排除grep。您可以用來LC_ALL=C grep解決這個問題。這應該是一件有效的事情,因為它#是可移植字元集的一部分,因此在給定係統上的區域設定之間應該保持不變。

相關內容