如何在awk脚本中移动grep?

如何在awk脚本中移动grep?,awk,Awk,下面有我想用awk的grep替换的i3grep命令。所以我试过了 ! /000000000000/; ! /000000000000/ $0; ! /000000000000/ $3; 在这里我没有得到一个错误,但是使用下面的脚本和 $ echo 000000000000 | awk '{ ! /000000000000/; print }' 000000000000 它没有像预期的那样跳过这些行 问题 有人能解释为什么我的“非grep”在awk中不起作用吗 grep -v '^#' $ho

下面有我想用awk的grep替换的i3
grep
命令。所以我试过了

! /000000000000/;
! /000000000000/ $0;
! /000000000000/ $3;
在这里我没有得到一个错误,但是使用下面的脚本和

$ echo 000000000000 | awk '{ ! /000000000000/; print }'
000000000000
它没有像预期的那样跳过这些行

问题

有人能解释为什么我的“非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

请尝试将代码更改为:

echo 000000000000 | awk '!/000000000000/'
尝试中出现问题:
$echo 000000000000|awk'{!/000000000000/;print}'
,因为您正在检查条件
/000000000000/
具有
在它之后,以便条件正常工作,并且不打印任何内容。但是在它后面有
print
,它不是在那种情况下出现的,所以它只是打印那一行

awk
适用于
模式{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

查看您的代码:

$ 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
}'
添加
打印
可以帮助您了解:

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

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

这是我能帮你的全部,因为没有足够的信息来提供更多信息

是否仅当线条与该图案不匹配时才打印线条?如果是这样,您需要
/废话/{print}
。注意模式在动作块之外。@Sandra Schlichting,您不需要将多个
grep
awk
一起使用。很好,你在帖子中展示了你的尝试。如果您可以简单地发布输入样本和预期输出样本,那么我们也可以在单个
awk
中发布。@Sandra Schlichting,如果看不到您的
reservations.conf
文件,除了我以前的评论之外,很难判断哪些内容不起作用。我显然希望
awk
的工作方式与
grep
类似,如果searhed不匹配,则转到下一个输入行。关于
模式{action}
我确实尝试了
/something/{next}
,正如这篇博文所示。为什么这样不行@SandraSchlichting,所以如果您不需要打印具有
000000000000
的行,那么您可以执行
/000000000000/{next}
/000000000000/
两者都应该可以工作。但是如果你这样做了
/000000000000/{next}
这将打印
000000000000000000
行,如果我在这里向您阐明我的观点,请告诉我?