假设有一个包含 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
解决这个问题。这应该是一件有效的事情,因为它#
是可移植字符集的一部分,因此在给定系统上的区域设置之间应该保持不变。