重複したIPアドレスを識別/表示するには、awk / sedの助けが必要です。

重複したIPアドレスを識別/表示するには、awk / sedの助けが必要です。

さようなら行ってください。

ポッド/ノード名と関連付けられたIPv6アドレスを含むテキストファイルがあります。両方のポッドのIPアドレスは同じです。最初のポッドはk8-worker0001c-cif-9d86d6dd4-vf9b9そして最後のポッドk8-worker0001c-ctdc-5bc95b699f-xnmrn、IPアドレスは2001:1890:e00f:3900::6

k8-worker0001c-cif-9d86d6dd4-vf9b9
         2001:1890:e00f:3900::4/64 global nodad
         2001:1890:e00f:3900::6/64 global 

k8-worker0001c-cifpartner-64c89f8bc8-8p5pq
         2001:1890:e00f:3900::10/64 global 

k8-worker0001c-ctd-7d759784ff-2gk5d
         2001:1890:e00f:3900::a/64 global nodad
         2001:1890:e00f:3900::d/64 global 

k8-worker0001c-ctd-7d759784ff-hd8jp
         2001:1890:e00f:3900::c/64 global 

k8-worker0001c-ctd-7d759784ff-qkk4t
         2001:1890:e00f:3900::8/64 global nodad
         2001:1890:e00f:3900::f/64 global 

k8-worker0001c-ctd-7d759784ff-t6lwz
         2001:1890:e00f:3900::5/64 global 

k8-worker0001c-ctd-7d759784ff-vl8x9
         2001:1890:e00f:3900::9/64 global nodad
         2001:1890:e00f:3900::b/64 global 

k8-worker0001c-ctdc-5bc95b699f-xnmrn
         2001:1890:e00f:3900::7/64 global nodad
         2001:1890:e00f:3900::6/64 global

ポッド名を含む残りのアドレスを保持しながら、重複したIPアドレスを識別するコードを1行だけ必要です。使ってみました。アッ !ボンしかし、これは私が望んでいない重複を排除します。

したがって、私は次のようなものが欲しい:

k8-worker0001c-cif-9d86d6dd4-vf9b9
         2001:1890:e00f:3900::4/64 global nodad
         2001:1890:e00f:3900::6/64 global          DUPLICATE!

k8-worker0001c-cifpartner-64c89f8bc8-8p5pq
         2001:1890:e00f:3900::10/64 global 

k8-worker0001c-ctd-7d759784ff-2gk5d
         2001:1890:e00f:3900::a/64 global nodad
         2001:1890:e00f:3900::d/64 global 

k8-worker0001c-ctd-7d759784ff-hd8jp
         2001:1890:e00f:3900::c/64 global 

k8-worker0001c-ctd-7d759784ff-qkk4t
         2001:1890:e00f:3900::8/64 global nodad
         2001:1890:e00f:3900::f/64 global 

k8-worker0001c-ctd-7d759784ff-t6lwz
         2001:1890:e00f:3900::5/64 global 

k8-worker0001c-ctd-7d759784ff-vl8x9
         2001:1890:e00f:3900::9/64 global nodad
         2001:1890:e00f:3900::b/64 global 

k8-worker0001c-ctdc-5bc95b699f-xnmrn
         2001:1890:e00f:3900::7/64 global nodad
         2001:1890:e00f:3900::6/64 global         DUPLICATE!

よろしくお願いします。

答え1

すべてのUnixシステムのすべてのシェルでawkを使用する2段階の方法:

$ $ awk '{sub(/\r$/,"")} NR==FNR{cnt[$1]++; next} {print $0 (NF && cnt[$1]>1 ? "\tDUPLICATE!" : "")}' file file
k8-worker0001c-cif-9d86d6dd4-vf9b9
         2001:1890:e00f:3900::4/64 global nodad
         2001:1890:e00f:3900::6/64 global       DUPLICATE!

k8-worker0001c-cifpartner-64c89f8bc8-8p5pq
         2001:1890:e00f:3900::10/64 global

k8-worker0001c-ctd-7d759784ff-2gk5d
         2001:1890:e00f:3900::a/64 global nodad
         2001:1890:e00f:3900::d/64 global

k8-worker0001c-ctd-7d759784ff-hd8jp
         2001:1890:e00f:3900::c/64 global

k8-worker0001c-ctd-7d759784ff-qkk4t
         2001:1890:e00f:3900::8/64 global nodad
         2001:1890:e00f:3900::f/64 global

k8-worker0001c-ctd-7d759784ff-t6lwz
         2001:1890:e00f:3900::5/64 global

k8-worker0001c-ctd-7d759784ff-vl8x9
         2001:1890:e00f:3900::9/64 global nodad
         2001:1890:e00f:3900::b/64 global

k8-worker0001c-ctdc-5bc95b699f-xnmrn
         2001:1890:e00f:3900::7/64 global nodad
         2001:1890:e00f:3900::6/64 global       DUPLICATE!

これは、ポッド名が一意であると仮定します。

答え2

Perl以下は、doubleを使用した単一行のショットですxargs

perl -MRegexp::Common -lnE '
    $h{$&}++ if /($RE{net}{IPv6})/;
    END{ print grep { $h{$_} > 1 } keys %h}
' file | xargs -I{} perl -spe 's/$ip.*/$&\t\tDUPLICATE!/g' -- -ip={} file

出力

k8-worker0001c-cif-9d86d6dd4-vf9b9
         2001:1890:e00f:3900::4/64 global nodad
         2001:1890:e00f:3900::6/64 global     DUPLICATE!

k8-worker0001c-cifpartner-64c89f8bc8-8p5pq
         2001:1890:e00f:3900::10/64 global 

k8-worker0001c-ctd-7d759784ff-2gk5d
         2001:1890:e00f:3900::a/64 global nodad
         2001:1890:e00f:3900::d/64 global 

k8-worker0001c-ctd-7d759784ff-hd8jp
         2001:1890:e00f:3900::c/64 global 

k8-worker0001c-ctd-7d759784ff-qkk4t
         2001:1890:e00f:3900::8/64 global nodad
         2001:1890:e00f:3900::f/64 global 

k8-worker0001c-ctd-7d759784ff-t6lwz
         2001:1890:e00f:3900::5/64 global 

k8-worker0001c-ctd-7d759784ff-vl8x9
         2001:1890:e00f:3900::9/64 global nodad
         2001:1890:e00f:3900::b/64 global 

k8-worker0001c-ctdc-5bc95b699f-xnmrn
         2001:1890:e00f:3900::7/64 global nodad
         2001:1890:e00f:3900::6/64 global    DUPLICATE!

必要

Perlモジュールが必要ですRegexp::Common

以下からインストールできます。

cpan Regexp::Common

またはパッケージマネージャを介して:

apt install libregexp-common-perl

Debianとその派生製品に適用されます。

システム全体のパッケージをインストールできない場合は、次のものを使用できます。perlbrew一般ユーザーとしてインストールするか、一般ユーザーとしてライブラリをダウンロードします。

wget https://sputnick.fr/downloads/Regexp-Common.gz
tar xjvf Regexp-Common.gz
ls ./lib

その後、次のものを使用できます。

perl -I./lib -MRegexp::Common -lnE '
    $h{$&}++ if /($RE{net}{IPv6})/;
    END{ print grep { $h{$_} > 1 } keys %h}
' file | xargs -I{} perl -spe 's/$ip.*/$&    DUPLICATE!/g' -- -ip={} file

答え3

これは非常に単純なPerlベースのアプローチです。入力が安定していると仮定します。つまり、スペースで始まる行には、スペースの後ろの最初のフィールドにIPアドレスがあります。デフォルトのPerlインストールで使用する必要があります。つまり、モジュールは必要ありません。

  perl -ne 's/\r//g; m/^\s+(\S+)\s+/ && $seen{$1}++; push @l, $_;
    END {$s=" "x7; foreach (@l) {m/^\s+(\S+)\s+/ && ($seen{$1}>1) && s/$/ $s DUPLICATE!/; print}}'

出力例と同じバイナリ出力を生成します。 :)

関連情報