さまざまな内容を含むデータファイルが与えられたら、まずIPアドレスで始まらない行を無視してからIPアドレスを出力し、その後に記号を含まない中括弧内の文字列を出力したいと思います=
。指定された行には1つ以上の文字列を含めることができます。
たとえば、
入力する:
junk12
junk34
198.0.12.20 [ joker penguin character=villian ] blah
198.0.13.20 [ super_man bat_man character=hero ] blah
198.0.14.20 [ lois_lane character=damsel ] blah
junk56
junk78
出力:
198.0.12.20 joker
198.0.12.20 penguin
198.0.13.20 super_man
198.0.13.20 bat_man
198.0.14.20 lois_lane
答え1
これを行うにはいくつかの方法がありますが、awk
次のことができます。
awk 'gsub(/^[0-9.]+ \[ /,$1 " ") { a=2; while (a<=NR && $a != "]") { if ($a !~ /=/) {print $1 " " $a } ; a++ } }'
これをもう少し読みやすいものに分けてみましょう。
gsub(/^[0-9.]+ \[ /,$1 " ") { .... }
これは数字とピリオドで始まり、その後にスペースとピリオドが続く行と一致します[
。したがって、一致10.20.30.40 [
が一致しませんjunk23
。これを最初のフィールドに置き換えてから実行します{...}
。
だから、次の行
198.0.12.20 [ joker penguin character=villian ] blah
次のセクションに進みます。
198.0.12.20 joker penguin character=villian ] blah
これで中間部分が出てきます。複数行で書くと分かりやすくなります。
a=2;
while (a<=NR && $a != "]")
{
if ($a !~ /=/) {print $1 " " $a }
a++;
}
したがって、2番目のフィールド(この場合は「clown」)から始まり、単語が不足するか、またはが表示されるまで続けます]
。見つかった単語ごとにanが含まれていない場合は、=
Aフィールド(IPアドレス)を印刷して単語。
結果:
198.0.12.20 joker
198.0.12.20 penguin
198.0.13.20 super_man
198.0.13.20 bat_man
198.0.14.20 lois_lane
(おそらくこれより良い方法があるでしょう!)