次の形式のログファイルがあります。
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
。それ以外の場合はf
0に設定します。
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の秘密の略です。
f
true(ゼロ以外)の場合、その行を印刷します。
追加テスト
コメントに基づいて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
$
これらの行はすべてそのまま削除されます。