计算文件中的行数而不计算空行

Wen*_*iao 2 grep regular-expression

假设有一个包含 7 行的文件。例如:

a
b
c
#

d
e
Run Code Online (Sandbox Code Playgroud)

当我运行时,grep -c '#' -c -v filenamehere 它给了我 6 行。

我希望它显示 5 行来消除那个空白空间。

Kus*_*nda 10

您的文件中有行,但您想计算非空且不以#.

$ grep -c '^[^#]' file
5
Run Code Online (Sandbox Code Playgroud)

这会计算在开头包含不是#字符的字符的行数。

该表达式[^#]匹配一个不是 的字符#。完整表达式^[^#]匹配行首的非#

空行不匹配此表达式,以#¹开头的行也不匹配。

如果您只想计算非空行:

$ grep -c '.' file
6
Run Code Online (Sandbox Code Playgroud)

这计算包含至少一个字符的行。


为了完整起见,计算空行:

$ grep -c -v '.' file
1
Run Code Online (Sandbox Code Playgroud)

要计算空行或以 开头的行#

$ grep -c -v '^[^#]' file
2
Run Code Online (Sandbox Code Playgroud)

请注意,-c-v都是“全局”选项。grep当它们在命令行上给出时,它们会改变整个操作的行为。指定-c-v多次没有意义,并且它们不采用选项参数。

另请注意,如果您在所有选项之后的第一个参数以外的任何地方指定模式或正则表达式,则使用-e 'pattern'以便grep知道这是您正在搜索的模式。也就是说,使用任一

grep -e '.' -c -v file
Run Code Online (Sandbox Code Playgroud)

或者

grep -c -e '.' -v file
Run Code Online (Sandbox Code Playgroud)

或者

grep -c -v '.' file
Run Code Online (Sandbox Code Playgroud)

GNUgrep将以这样一种方式重新排列命令行,即选项出现在路径名操作数之前(除非POSIXLY_CORRECT在环境中设置),但您通常希望编写适用于任何grep实现的可移植 shell 代码。


¹ 以非字符开头的行(在用户的语言环境charmap 中碰巧没有形成有效字符的字节序列)也将被排除在大多数grep实现中。你可以LC_ALL=C grep用来解决这个问题。作为#可移植字符集的一部分,这应该是一件有效的事情,因此应该在给定系统上的区域设置之间保持不变。

  • *`grep -c '#' -c` 中的*正确做法是计算 `-c` 文件中包含 `#` 的行数,这就是所有 POSIX 兼容实现所做的。问题是 GNU `grep` 是当今大多数系统上的实现(或者在某些最近的 BSD 上进行分叉或重写),除非环境中存在 POSIXLY_CORRECT 变量,否则 GNU `grep` 不会这样做。 (2认同)