如何grep不以“#”或“;”开头的行?


78

我想grep smb.conf,只看到未注释的行。


1
testparm做得更好,因为它也显示默认值。
F. Hauri 2013年

@ F.Hauri谢谢。它也在工作。但是它还会产生一些不需要的信息(在我的情况下),这也应该被删除……
否认


通过PCRE的另一种方式grep stackoverflow.com/a/45917459/3297613
Avinash Raj

Answers:


125
grep "^[^#;]" smb.conf

第一个^指的是该行的开头,因此不会排除带有第一个字符之后的注释的行。 [^#;]表示不是#或的任何字符;

换句话说,它报告说,比其他任何字符开头的行#;。它与报告不以#和开头;(您要使用grep -v '^[#;]')的行并不相同,因为它还排除了行,但是在这种情况下,这可能是更好的选择,因为我怀疑您关心空行。

如果要忽略前导空白字符,可以将其更改为:

grep '^[[:blank:]]*[^[:blank:]#;]' smb.conf

要么

grep -vxE '[[:blank:]]*([#;].*)?' smb.conf

要么

awk '$1 ~ /^[^;#]/' smb.conf

正确的答案是:cat /etc/samba/smb.conf | grep ^[^#\;]但是无论如何,谢谢您
否认2013年

是的,或者您可以使用“引号”;我随后对其进行了编辑。
goldilocks 2013年

7
@denys你错了:goldilocks的反应并不比你差。.1请避免使用cat ...| 语法!.2对于搅动空行和仅包含空格的行,也许可以用注释U来使用:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri 2013年

7
@EmanuelBerg这是没用的叉子。cat file | grep "blah"暗示通过fifo运行两个二进制文件,而grep "blah" <file做的事情完全相同,并且file 自然地绑定到grep的文件STDIN[bash]无用的猫是通过任何搜索引擎进行搜索的全功能主题!-> blog.sanctum.geek.nz/useless-use-of-cat ...用于示例
F. Hauri

2
它做的并不完全相同。它创建2个进程和一个管道,其中1个进程就足够了。阅读@ F.Hauri的最新评论中给出的链接。
rahmu 2013年

4

Vim解决方案:

:v/^\s*[#\n]/p

尝试自己找到vim解决方案时,我偶然发现了这个问题。


1
这还将删除以空格开头的行。
库沙兰南达

真正。我发现这对于配置文件很有用,因为注释之间的行会填满输出。如果您想保留空白行,更改*+:像现在这样v/^\s+[#\n]/p
戴维·洛德

3

可以通过以下方式消除Oliver Nadj的答案中通往grep的管道:(假定为GNU grep或兼容):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>

第二个grep i @ nadj看起来没用,@ goldilocks的回答远远不够。
Archemar

1
我同意goldilocks的回答是正确的。但是,我也认为不显示空行很有用。
Morten Lind


2

这些例子可能对人们有用。

[user@host tmp]$ cat whitespacetest
# Line 1 is a comment with hash symbol as first char

# Line 2 is a comment with hash symbol as second char
  # Line 3 is a comment with hash symbol as third char
        # Line 4 is a comment with tab first, then hash
        ; Line 5 is a comment with tab first, then semicolon. Comment char is ;
; Line 6 is a comment with semicolon symbol as first char
[user@host tmp]$

第一个grep示例不包括以任意数量的空格开头,后跟哈希符号的行。

[user@host tmp]$ grep -v '^[[:space:]]*#' whitespacetest

        ; Line 5 is a comment with tab first, then semicolon. Comment char is ;
; Line 6 is a comment with semicolon symbol as first char
[user@host tmp]$

第二个不包括以任意数量的空格开头的行,后跟一个哈希符号或分号。

[user@host tmp]$ grep -v '^[[:space:]]*[#;]' whitespacetest

[user@host tmp]$

0

在这里,我得到了更好的一个(假设是GNU grep或兼容的):

grep -v '^[#;/%<]\|^\s*$' anyfile.conf

#;/%<包括以方括号开头的行,而在管道之后的第二个过滤器\s*$用于空白行。


2
什么类型的conf文件</用于注释?我知道很多conf文件格式,<除了注释之外,什么都没有。!有时像在X资源文件中一样使用。
斯特凡Chazelas



-3

这应该显示给您的文件没有以#下列开头的行: grep -v "^#" filename


这对以开头的行没有任何作用;
Kusalananda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.