我使用下面的命令过滤文件中的 # 和空行。但是,我们如何在 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
全局替换a
为b
。使用#.*
asa
和空b
将删除行后所有匹配的注释。
希望对您有所帮助。问候
答案4
知道了!
[root@localhost ~]# cat file | grep -v ^'$\|#'