awk可以打印没有图案的行吗?

awk可以打印没有图案的行吗?,awk,Awk,awk能否打印与其中一种图案不匹配的所有线条 换句话说,我想变换一些线,但保留其余的不变。因此,如果a/pattern/matched,我将提供一个自定义块来打印该行。我只需要提供一个默认匹配器(如else)来打印其他行。是的,只需使用任何非零数字,awk将执行其默认操作,即打印行: awk '7' file 如果你想把它作为一个“else”,把“next”放在你为特殊处理选择的任何行之后,这样就不会对它们执行这一行了 awk '/pattern/{special processing; ne

awk能否打印与其中一种图案不匹配的所有线条


换句话说,我想变换一些线,但保留其余的不变。因此,如果a/pattern/matched,我将提供一个自定义块来打印该行。我只需要提供一个默认匹配器(如else)来打印其他行。

是的,只需使用任何非零数字,awk将执行其默认操作,即打印行:

awk '7' file
如果你想把它作为一个“else”,把“next”放在你为特殊处理选择的任何行之后,这样就不会对它们执行这一行了

awk '/pattern/{special processing; next} 7' file
你可以做:

awk '/pattern/ {do something with line} 1' file
此处,
1
将打印所有行,包括已更改行和未更改行


仅显示使用
else if发布的解决方案
Askan

awk '{
    if (/pattern/)
        print "Line number:",NR,"pattern matched"
    else if (/Second/) 
        print "Line number:",NR,"Second matched"
    else 
        print "Line number:",NR,"Another line matched"
    }' file

您可以取消模式以获得类似于
else
的行为:

awk '
    /pattern/ {
        # custom block to print the line    
    }
    !/pattern/ {
        # else do other things
    }
'

例如,如果您使用的是
gawk
,则可以使用
switch

awk '{switch ($0) {
case /pattern/:
    print "Line number:",NR,"pattern matched"
    break

case /Second/:
    print "Line number:",NR,"Second matched"
    break

default:
    print "Line number:",NR,"Another line matched"

}}' input.txt
input.txt

This line matches the pattern
Second line does not match
Hello
This line also matches the pattern
Another line
输出:

Line number: 1 pattern matched
Line number: 2 Second matched
Line number: 3 Another line matched
Line number: 4 pattern matched
Line number: 5 Another line matched

您还可以通过删除案例之间的
break
来对案例进行分组

你最好举个例子,说说你喜欢什么。有了600分的声誉,你应该知道这有多重要。你通常不会这么做。如果将
next
放入已找到的块中,则另一个块将是未找到的块
awk'/pattern/{执行此操作;下一步}{否则将运行此块}'
。在您的示例中,两个测试都将始终运行,并且可能会使程序速度减慢一些。这
/模式/
表单在这样的情况下非常方便:
awk'/^IpExt/&&/Mcast/{print$4}'/proc/net/netstat
。换句话说,它会找到一条与某个模式匹配的线,但会排除与另一个模式匹配的线。我几乎没有看到任何人使用这里或其他地方使用的
开关
函数。大多数人倾向于使用
if-else-if-else
。我更新了我的帖子。我从来都不知道这个功能的存在(我完全承担了从未完全阅读GNU文档的责任)+1用于共享。@JS웃 我见过它,但和我在帖子中添加的解决方案相比,它很少被使用。我发布的内容将是可移植的,不仅是gnu awk,你最好在看到答案之前编辑并更新它
7
是一个注册商标。让我们希望他将模仿他精湛的风格视为恭维……:-)
echo -n "one\ntwo\nthree\nfour" | 
  awk '{a=1} /one/ {print 1;a=0} /three/ {print 3;a=0} a'

1
two
3
four