我有一个大文件,其中有很多不必要的信息。我只对编辑和下一个之间的部分感兴趣,并将它们作为一个条目处理。我设法像这样过滤掉它......
'
awk 'BEGIN {FS = "\n"; RS = ""; OFS = "\n" ;} {if (/intf/ && /addr/) { print $0"\n"}}' > outputfile
输出文件的示例如下所示。
edit 114
set uuid 6cb43
set action accept
set srcintf "Port-ch40.1657"
set dstintf "any"
set srcaddr "1.1.1.1"
set dstaddr "all"
set schedule "always"
set service "ALL_ICMP" "icmp-echo-reply" "icmp-source-quench" "icmp-time-exceeded" "icmp-unreachable"
set logtraffic all
next
edit 330
set uuid 6d3d
set action accept
set srcintf "Po40.28"
set dstintf "any"
set srcaddr "all"
set dstaddr "2.2.2.2"
set schedule "always"
set service "ALL_ICMP" "icmp-echo-reply" "icmp-source-quench" "icmp-time-exceeded" "icmp-unreachable"
set logtraffic all
next
grep 有一个选项,其中值可以来自文件(grep -f filterfile textfile)让我们假设 filterfile 包含值...
1.1.1.1
3.3.3.3
实际上会更多,因此手动输入可能不起作用。
awk 'BEGIN {FS = "\n"; RS = ""; OFS = "\n" ;} {if (/intf/ && /addr/ &&(/1.1.1.1/||/3.3.3.3/)) { print $0"\n"}}' > outputfile
是否可以修改 awk 命令来处理来自文件的值
awk 'BEGIN {FS = "\n"; RS = ""; OFS = "\n" ;} {if (/intf/ && /addr/ &&(values_from_filterfile)) { print $0"\n"}}' > outputfile
如果你自己的:
这确实是您需要做的,您可以将每行包含一些 ip 地址的“match.list”文件中的内容与:
FWIW我不会为此使用正则表达式,我会
v[]
在下面创建一个数组(),将标签(例如)映射srcaddr
到它们的值(例如"1.1.1.1"
或"all"
),然后您可以对数组索引进行哈希查找以查找哪些标签存在于当前块以及您感兴趣的任何标签的值。例如,使用任何 POSIX awk:使用该结构,您可以轻松地测试或更改您喜欢的任何标签的任何值,并为每个块中每个标签的内容编写更精确的测试,而不仅仅是在整个块中进行正则表达式比较。
uuid
例如,如果您想查找/输出is6cb43
、schedule
isalways
和service
include 的块,"icmp-time-exceeded"
您可以更改此设置:对此:
v[]
如果您想在打印之前将任何标签设置为其他值,您可以在打印循环之前将其填充:要回答特定问题,awk 可以处理来自文件的值,是的,您可以
getline
使用<
文件名重定向命令的输入。添加到 BEGIN 块的末尾:由于您已经设置了 FS 和 RS,
getline
会将整个文件读入$0
,因此您只需用正则表达式运算符替换行分隔符即可|
。使用结果变量match
: