解释

解释

我使用下面的命令过滤文件中的 # 和空行。但是,我们如何在 Linux 中使用单个 grep 来 grep 未注释的行和空行。

[root@localhost ~]# cat test | grep -v ^# | grep -v ^$

答案1

对于简单的情况,我的首选模式是:

$ egrep '^[^#]'

此模式匹配以磅号以外的其他字符开头的行。

如果您将“空白”行的定义扩展为包含一行全是空白的行,则该模式将失败,因为它将匹配这样的行。如果您允许注释行中井号前有任意空白(Apache、bash 和其他程序都这样做),该模式也会失败。

如果这些情况对你很重要,那么这种模式更好:

$ egrep '^[[:blank:]]*[^[:blank:]#]'

例如:

$ cat test
# comment
  # spaces then comment
config # then comment
before empty line

after empty line
space only on next line


tab only on next line

$ egrep '^[[:blank:]]*[^[:blank:]#]' test
config # then comment
before empty line
after empty line
space only on next line
tab only on next line
$

答案2

IIUC,您想显示非空白行和非注释行。您可以-e使用单个grep命令来实现这一点:

grep -v -e "^#" -e "^$" test

例如,如果你test看起来像这样:

#a
uncommented line

#comment below blank line

输出将是:

$ grep -v -e "^#" -e "^$" test
uncommented line

答案3

考虑该文件:

valid config line 1
# Comment
valid config line 2 # Comment
Blank line between

These two
One space in the line between

These two

如果你考虑以下情况:

  • 以 # 开头的行
  • 空行

您可以使用cat file | grep -v '^$\|^#'cat file | grep -v '^\($\|#\)'

你将得到如下结果:

valid config line 1
valid config line 2 # Comment
Blank line between
These two
One space in the line between

These two

但是,我还会考虑以配置行开头然后有内联注释的行(在多个配置文件中支持),这些行不是空白的但只有空格,对于这个在单个命令中,我会使用 sed:

cat file | sed '/^\(#\|[[:space:]]*$\)/d;s/#.*//g'

获取:

valid config line 1
valid config line 2 
Blank line between
These two
One space in the line between
These two

解释

  • [[:space:]]*$匹配行尾前的 0 个或多个空格
  • ^\(a\|b\)匹配以a或开头的行b,使用#asa[[:space:]]*$asb将匹配所有以 开头的行#、空行以及仅包含空格的行。
  • /match/d删除所有匹配的行
  • ;分隔 sed 命令
  • s/a/b/g全局替换ab。使用#.*asa和空b将删除行后所有匹配的注释。

希望对您有所帮助。问候

答案4

知道了!

[root@localhost ~]# cat file | grep -v ^'$\|#'

相关内容