如何在awk脚本中移动grep?

时间:2018-11-12 11:51:10

标签: awk

下面有I 3 grep命令,我想用awk的grep替换。所以我尝试过

! /000000000000/;
! /000000000000/ $0;
! /000000000000/ $3;

我没有收到错误,但是同时使用下面的脚本和

进行了测试
$ echo 000000000000 | awk '{ ! /000000000000/; print }'
000000000000

它没有按预期跳过行。

问题

谁能解释为什么我的“ not grep”在awk中不起作用?

grep -v '^#' $hosts | grep -E '[0-9A-F]{12}\b' | grep -v 000000000000 | awk '{
    print "host "$5" {"
    print "  option host-name \""$5"\";"

    gsub(/..\B/,"&:", $3)
    print "  hardware ethernet "$3";"

    print "  fixed-address "$1";"
    print "}"
    print ""
}' > /etc/dhcp/reservations.conf

2 个答案:

答案 0 :(得分:1)

能否请您尝试将代码更改为:

echo 000000000000 | awk '!/000000000000/'

尝试中的问题: $ echo 000000000000 | awk '{ ! /000000000000/; print }'因为您正在检查条件! /000000000000/,其后有;,所以该条件效果很好,请勿打印任何内容。但是随后您有print,在这种情况下不会出现,因此它只打印该行。

awkpattern{action}上起作用,如果您在中间插入了半冒号,则意味着条件在它之前结束,而;之后的语句一起成为awk的新语句



编辑: :通过在此处查看OP的尝试来添加可能的解决方案,由于OP没有显示任何示例,因此根本没有经过测试。另外,我使用的是--re-interval,因为我的awk版本比较旧,如果框中有awk的新版本,则可以删除。

awk --re-interval '!/^#/ && !/000000000000/ && /[0-9A-Fa-f]{12}/{
    print "host "$5" {"
    print "  option host-name \""$5"\";"
    gsub(/..\B/,"&:", $3)
    print "  hardware ethernet "$3";"
    print "  fixed-address "$1";"
    print "}"
    print ""
}' "$host" > /etc/dhcp/reservations.conf

答案 1 :(得分:1)

看看您的代码:

$ echo 000000000000 | awk '
{ 
    ! /000000000000/ # on given input this evaluates to false 
                     # but since its in action, affects nothing
    print            # this prints the record regardless of whatever happened above
}'

添加print可以帮助您了解:

$ echo 000000000000 | awk '{ print ! /000000000000/; print }'
0
000000000000

删除!

$ echo 000000000000 | awk '{ print /000000000000/; print }'
1
000000000000

由于没有足够的信息来提供更多信息,因此我可以为您提供帮助。