【问题标题】:Can awk print lines that do not have a pattern?awk 可以打印没有模式的行吗?
【发布时间】:2019-03-08 00:07:01
【问题描述】:

awk 可以打印所有与其中一种模式不匹配的行吗?

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

【问题讨论】:

  • 你最好举个例子,你喜欢什么。声望 600 分,你应该知道这有多重要。

标签: awk


【解决方案1】:

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

awk '7' file

如果您希望它作为“else”,请将“next”放在您选择进行特殊处理的任何行之后,这样就不会为它们执行这一行。

awk '/pattern/{special processing; next} 7' file

【讨论】:

  • 您最好在Kent 看到它之前编辑和更新您的答案。 7 是注册商标。
  • 让我们希望他将模仿他精湛的风格视为奉承... :-)
【解决方案2】:

您可以否定该模式以获得else 类似的行为:

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

【讨论】:

  • 你通常不会这样做。如果您将next 放在找到的块中,则另一个块将是未找到的块。 awk '/pattern/ {do this;next} {else this block will be run}'。在您的示例中,两个测试都将始终运行,并且可能会减慢程序的速度。
  • !/pattern/ 表单在以下情况下很方便:awk '/^IpExt/ && !/Mcast/ {print $4}' /proc/net/netstat。换句话说,它会找到与某个模式匹配的行,然后排除与另一个模式匹配的行。
【解决方案3】:

你可以这样做:

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

【讨论】:

    【解决方案4】:

    例如,如果您使用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
    

    输入.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 来对案例进行分组。 more info

    【讨论】:

    • 我几乎没有看到有人使用这里或其他地方使用的switch 函数。大多数人倾向于使用if else if else。查看我更新的帖子。
    • 从不知道这个功能甚至存在(我完全承担了从未完整阅读过 GNU 文档的责任)。 +1 分享。
    • @JS웃 我已经看到了,但是与我在帖子中添加的相同解决方案相比,它很少使用。而且我发布的内容将是可移植的,不仅仅是gnu awk
    【解决方案5】:
    echo -n "one\ntwo\nthree\nfour" | 
      awk '{a=1} /one/ {print 1;a=0} /three/ {print 3;a=0} a'
    
    1
    two
    3
    four
    

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多