1

前の質問で、正規表現に応じてログファイルから出力する方法を尋ねました。grep を使用してファイルから一意のコード行を出力する方法は?

これで、私が使用しているスクリプトは、次のようなリストを出力します。

11.12.13.14 www.mydomain.org.uk
11.12.13.16 www.mydomain.org.uk
105.2.3.1 www.myseconddomain.org.uk
105.2.3.1 myseconddomain.org.uk

私がやりたいのは、同じCクラスIPを共有する行を消去することです。だから私は出力への前の答えを微調整したいと思います:

11.12.13.14 www.mydomain.org.uk
105.2.3.1 www.myseconddomain.org.uk

どうすればそれを達成できますか?

4

2 に答える 2

2

これがトリックを行うべきPerlワンライナーです:

perl -ne 'print if /^((\d+\.){3})/ and not $seen{$1}++' < logfile.txt

正規表現/^((\d+\.){3}/は、IPの最初の3つのオクテット(正確には、行の先頭にある1つ以上の数字の3つのシーケンス、それぞれにピリオドが続く)と一致し、それらをでキャプチャします$1。次に、式$seen{$1}++はハッシュ内の対応する要素をインクリメントし(必要に応じて作成します)、インクリメント%seenの値を返します(したがって、の値が以前に表示されていない場合にのみfalseになります)。$1

于 2013-03-08T21:31:05.990 に答える
0

awkワンライナーを試してみてください:

awk '!a[$1]++ && !b[$2]++' file

テスト

kent$  echo "11.12.13.14 www.mydomain.org.uk
11.12.13.16 www.mydomain.org.uk
105.2.3.1 www.myseconddomain.org.uk
105.2.3.1 myseconddomain.org.uk"|awk '!a[$1]++ && !b[$2]++'
11.12.13.14 www.mydomain.org.uk
105.2.3.1 www.myseconddomain.org.uk
于 2013-03-08T21:27:49.127 に答える