下面有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
答案 0 :(得分:1)
能否请您尝试将代码更改为:
echo 000000000000 | awk '!/000000000000/'
尝试中的问题: $ echo 000000000000 | awk '{ ! /000000000000/; print }'
因为您正在检查条件! /000000000000/
,其后有;
,所以该条件效果很好,请勿打印任何内容。但是随后您有print
,在这种情况下不会出现,因此它只打印该行。
awk
在pattern{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
由于没有足够的信息来提供更多信息,因此我可以为您提供帮助。