不要な情報がたくさんある大容量ファイルがあります。私は編集と次の間の部分にのみ興味があり、それを1つの項目として扱います。こうしてフィルタリングしたんだけど..
'
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)。フィルタファイルに値が含まれているとします。
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
ベストアンサー1
あなたの場合:
awk 'BEGIN {FS = "\n"; RS = ""; OFS = "\n" ;} {if (/intf/ && /addr/ &&(/1.1.1.1/||/3.3.3.3/)) { print $0"\n"}}' > outputfile
これがまさにあなたがしなければならないことです。 1行にいくつかのIPアドレスを含む「match.list」ファイルの内容を次のように比較できます。
gawk '
( NR==FNR ) { # NR==FNR only when parsing the first file...
ipreg=$0; # get one ip from the first file
gsub(".", "\.", ipreg); #ensure each "." becomes "\." for the regex
ipreg= "\<" ipreg "\>" # add beginning of word / end of word delimiters
# that way 1.2.3.4 will NOT match: 11.2.3.42
ipsreg=ipsreg sep ipreg; sep="|" # add it to the list of ipsreg
# and sep only added before the 2+ elements as it is an empty string for the 1st
next # skip everything else, we are parsing the first file...
}
( /intf/ && /addr/ && ( $0 ~ ipsreg ) ) # default action will be print $0 if it matches...
# and as ORS at that point will have been set to "\n\n",
# it will print the record + an empty line after it
' match.list FS="\n" RS="" OFS="\n" ORS="\n\n" - > outputfile
# the things between match.list and - will be seen as definitions to be done at that time,
# as they contain a "=", and not be interpreted as filenames
# - : is STDIN, and will be the 2nd "file" parsed, where NR>FNR (FNR=for the current file, NR=from the beginning)