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

den*_*nys 105 grep

我想 grepsmb.conf并只查看未注释的行。

gol*_*cks 179

grep "^[^#;]" smb.conf
Run Code Online (Sandbox Code Playgroud)

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

换句话说,它报告以除#and以外的任何字符开头的行;。这与报告不以#and开头的行;(您将使用的行grep -v '^[#;]')不同,因为它还排除了行,但在这种情况下这可能更可取,因为我怀疑您是否关心空行。

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

grep '^[[:blank:]]*[^[:blank:]#;]' smb.conf
Run Code Online (Sandbox Code Playgroud)

或者

grep -vxE '[[:blank:]]*([#;].*)?' smb.conf
Run Code Online (Sandbox Code Playgroud)

或者

awk '$1 ~ /^[^;#]/' smb.conf
Run Code Online (Sandbox Code Playgroud)

  • @EmanuelBerg 这是一个没用的叉子。`猫文件| grep "blah"` 意味着通过 *fifo* 运行两个二进制文件,而 `grep "blah" <file` 做的完全一样,并将 `file` *naturaly* 绑定到 grep 的 `STDIN`。*[bash] 无用的猫* 是通过任何搜索引擎进行搜索的全功能主题!-> http://blog.sanctum.geek.nz/useless-use-of-cat/ ... 示例 (8认同)
  • @denys 你错了:金发姑娘的反应并不比你差。.1 请避免使用`cat ...| ` 语法!。.2 对于仅包含空格的空行和仅包含空格的行,您可以使用注释:`grep -v "^ *\(#.*\|\)$" < smb.conf` (7认同)
  • 它不会*完全相同*。它创建了 2 个进程和一个管道,其中 1 个进程就足够了。阅读@F.Hauri 最后评论中给出的链接。 (2认同)

小智 5

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

[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]$
Run Code Online (Sandbox Code Playgroud)

第一个 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]$
Run Code Online (Sandbox Code Playgroud)

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

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

[user@host tmp]$
Run Code Online (Sandbox Code Playgroud)


小智 5

oliver nadj 的答案中的 grep 管道可以通过以下方式消除(假设 GNUgrep或兼容):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>
Run Code Online (Sandbox Code Playgroud)


Dav*_*ord 5

维姆解决方案:

:v/^\s*[#\n]/p
Run Code Online (Sandbox Code Playgroud)

我在自己寻找 vim 解决方案时偶然发现了这个问题。