안녕히 가세요.
포드/노드 이름 및 연결된 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 주소를 식별하는 코드 한 줄만 있으면 됩니다. 나는 사용해 보았습니다.앗 ! 본그러나 이것은 내가 원하지 않는 중복을 제거합니다.
그러므로 나는 다음과 같은 것을 원합니다 :
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}}'
예제 출력과 동일한 이진 출력을 생성합니다. :)