範囲を除外しながら、特定の列からIP範囲を含む行を削除します。

範囲を除外しながら、特定の列からIP範囲を含む行を削除します。

次の形式のログファイルがあります。

Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101"

192.168.xxの範囲のIPを含むすべての行を削除する必要がありますが、4番目の列に表示される場合にのみ適用されます。

また、192.168.xxの範囲から3つのIPを除外する必要があります。これを呼ぶ

192.168.125.100
192.168.126.100
192.168.155.240 

このコマンドを完了して、列4から192.168.xxの範囲内のすべてのIPを検索し、192.168.125.100、192.168.126.100、および192.168.155.240を含む行を除くすべての行を削除する方法.

awk '{print $4}' file | grep '192.168' | "remove all found except" | > save back to original file

ベストアンサー1

努力する:

awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file

はい

次のテストファイルを検討してください。

$ cat file
Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101"
Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"

あなたのルールについて私が理解したのは、上記の最初の行を除くすべての項目を維持したいということです。

$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file
Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101"
Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"

複数行バージョン

コードを複数行にわたって分散したい場合:

awk '
  {
    f=1
  }

  $4 ~ /^192.168/ {
    f=0
  }

  $4 ~ /192.168.(125.100|126.100|155.240)/ {
    f=1
  }

  f
  ' file

どのように動作しますか?

このコードは単一の変数を使用しますf。行を維持するにはを設定しますf=1。それ以外の場合はf0に設定します。

  • f=1

    まず、行を保存する必要があるとしましょう。

  • $4 ~ /^192.168/{f=0}

    $4で始まる場合は、その192.168行を失う必要がある行としてマークしてください。

  • $4 ~ /192.168.(125.100|126.100|155.240)/{f=1}

    これら3つの特殊な場合は、行をkeeper:とマークしますf=1

  • f

    これはawkの秘密の略です。ftrue(ゼロ以外)の場合、その行を印刷します。

追加テスト

コメントに基づいてfile2を試してみましょう。

$ cat file2
Jul 13 21:47:41 192.168.100.125 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.202.150 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.101.45 "user from 192.168.100.101"

それでは、次のコマンドを実行してみましょう。

$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file2
$ 

これらの行はすべてそのまま削除されます。

おすすめ記事