在awk中跳过行和正则表达式

时间:2014-10-25 21:07:29

标签: regex shell awk

我正在使用awk,我需要跳过空白或评论的行。我一直在循环中尝试查看它是否与正则表达式匹配,然后使用下一个

{if ($0 ~"/^($|#)/" ) {next;}}

但if语句永远不会被击中,我无法弄清楚原因。 (我的输入有空行和注释)

我需要在块中的awkscript中添加此行,而不是命令行参数。

4 个答案:

答案 0 :(得分:1)

假设您在awk代码块中并未从匹配模式的默认打印中受益,并且您需要使用if测试,则此处是解决方案

$ echo "a
b
c

d
#
#e

f

" | awk '{if ($0 ~ /^(#|$)/ ) {next;} ;print}'

产生

的输出
a
b
c
d
f

如果要跳过包含空格/标签的空行,可以添加

awk '{if ($0 ~ /^(#|[ \t]*$)/ ) {next;} ;print}'
#-------------------^^^^^^
#                   means char-class of space and tab char
#                   * means zero or more of preceding

IHTH

答案 1 :(得分:1)

awk中,正则表达式由开始和结束斜杠标记。如果将它放在引号内,它将不再是正则表达式并成为一个字符串。因此,替换:

{if ($0 ~"/^($|#)/" ) {next;}}

使用:

{if ($0 ~ /^($|#)/ ) {next;}}

实施例

考虑输入文件:

$ cat input
one
#comment
two

three

four

现在观察awk脚本:

$ awk '{if ($0 ~ /^($|#)/ ) {next;}} 1' input
one
two
three
four

答案 2 :(得分:0)

您可以使用以下方法:

awk '! /^($|#)/' infile

对于不以#开头或空白的每一行,它使用默认的print操作。

答案 3 :(得分:0)

awk '/^$|#/{next} {print $0}' 

会完成这项工作

更简单

awk '/^[^$#]/ '

它的作用是什么?

/^[^$#]/匹配正则表达式的每一行,如果找到匹配项,则完成打印整个记录的默认操作。

^将正则表达式固定在线的开头。

[^$#]否定了字符类。

确保行的开头不是

$ =>线是空的,否定跳过线 # =>评论

例如

$ cat input 
hello
#world

this is a
test

$ awk '/^[^$#]/ ' input 
hello
this is a
test