大多数情况下筛选有用的行无非就是
一. 去掉注释行
二. 去掉空白行
注释行分两种情况:
1. 注释字符在行首
2. 注释字符前面还有未知多个空白字符,一般就是两种: 空格 制表符
空白行也可能有未知多个空白字符,一般只考虑 空格 和 制表符
假定现在有一个配置文件 httpd.conf , 注释字符是 # , 现在分别用grep sed awk 来筛选有用的行(内容太多不贴了,有兴趣自己测)
1、grep
cat /etc/httpd/conf/httpd.conf|grep -v "^[ ]*#"|grep -v "^[ ]*$"
cat /etc/httpd/conf/httpd.conf|grep -v "^["$'\t'" ]*#"|grep -v "^["$'\t'" ]*$"
cat /etc/httpd/conf/httpd.conf|grep -Ev "^[ ]*#|^[ ]*$"
cat /etc/httpd/conf/httpd.conf|grep -Ev "^["$'\t'" ]*#|^["$'\t'" ]*$"
cat /etc/httpd/conf/httpd.conf|grep -Ev "^["$'\t'" ]*(#|$)"
cat /etc/httpd/conf/httpd.conf|grep -Pv "^[$'\t' ]*(#|$)"
解释:
1、grep参数解释:
-v 反选
-E grep扩展正则表达式,可以直接写成egrep
-P Perl语言形式的扩展正则表达式
2、在shell中制表符的输入方式是 ctrl+v ,然后按 Tab 键,空格的话直接按 空格 键即可,于是就看到了上面命令中 [ ] 里面长长的空白,既包含了一个Tab,也包含了一个空格,而且位置不同的时候长度看起来也不同,当然这和系统与终端窗口的交互设计有关,不影响效果。
3、原始的grep也能识别 $‘\t’ 这种制表符的写法,前提是 $‘\t’ 外层没有引号,如果外层已经有引号了,还要给 $‘\t’ 单独再用一对引号引起来,否则无法正确识别。
4、用扩展正则表达式的明显好处是两步合并成一步,其实就是找并集的补集
5、Perl形式的扩展正则表达式兼容所有grep -E(或者egrep)形式的写法,并且即便 $‘\t’ 外层有引号也能被正确识别,不需要再给一对引号。
2、sed
cat /etc/httpd/conf/httpd.conf|sed -rn '/^[ \t]*(#|$)/!p'
3、awk
cat /etc/httpd/conf/httpd.conf|awk '!/^[ \t]*(#|$)/ {print $0}'
sed 和 awk 原生就能识别 \t ,所以这两种写法显得更友好,不过语法结构稍微复杂一些。
注: