파일의 두 번째 필드를 기준으로 IP 주소 정렬

파일의 두 번째 필드를 기준으로 IP 주소 정렬

내 ksh 스크립트에 다음 작업을 추가해야 합니다(OS - linux/solaris).

다음 파일이 있습니다

 more test.txt


 /etc/backup/app 172.1.120      172.110.120 
 /etc/backup/app 172.1.120.12   172.110.120.98 
 /etc/backup/app 192.1.120      192.120.120 
 /etc/backup/app 172.1.120.1      172.110.120.7 
 /var/log/df     193.23.2       193.23.2
 /var/log/df     193.23.2.111   193.23.2.159

모든 IP를 찾는 방법4옥텟파일 시작 부분에 다른 IP3옥텟

참고 – IP는 두 번째 필드를 기준으로 정렬됩니다.

요청 파일의 예(정렬 후)

    more test.txt

    /etc/backup/app 172.1.120.12   172.110.120.98 
    /etc/backup/app 172.1.120.1    172.110.120.7
    /var/log/df     193.23.2.111   193.23.2.159
    /etc/backup/app 172.1.120      172.110.120 
    /etc/backup/app 192.1.120      192.120.120 
    /var/log/df     193.23.2       193.23.2

해결 방법은 sort 또는 ksh/awk/sed/perl oneliner...등을 사용하여 수행할 수 있습니다.

답변1

GNU awk여기에 필요한 줄이 있다고 가정해 보겠습니다 .

$ awk '{n=split($2,ip,".");if(n==4)print $0;else a[$2]=$0}END{n=asorti(a,b);for(i=1;i<=n;i++)print a[b[i]]}' file
/etc/backup/app 172.1.120.12   172.110.120.98 
/etc/backup/app 172.1.120.1    172.110.120.7 
/var/log/df     193.23.2.111   193.23.2.159
/etc/backup/app 172.1.120      172.110.120 
/etc/backup/app 192.1.120      192.120.120 
/var/log/df     193.23.2       193.23.2

답변2

awk '{printf "%s.,%s\n", $2, $0}' | \
sed -E -e 's/^(([0-9]+\.){4}),/0.\1,/' -e 's/^(([0-9]+\.){3}),/1.\1,/' | \
sort -t. -k 1,1 -k 3,3 | \
sed -E -e 's/^[^,]+,//'`

아이디어는 다음과 같습니다.

  1. 관련 필드를 각 줄의 시작 부분에 복사하고 특수 구분 기호(이 경우 쉼표)를 추가합니다.
  2. sedIP 주소의 옥텟 수에 따라 일부 값을 추가하는 데 사용됩니다 (4옥텟에는 0, 3옥텟에는 1을 사용했습니다).
  3. 관련 필드의 값 정렬
  4. 추가한 모든 항목을 제거합니다.

답변3

cat <(awk '{if($2~/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/){print $0}}' test.txt | sort -k 2) <(awk '{if($2~/^[0-9]*\.[0-9]*\.[0-9]*$/){print $0}}' test.txt | sort -k 2)
  • 두 번째 필드에서 4옥텟이 있는 행을 일치시키고 정렬합니다.
  • 두 번째 필드가 3옥텟 뒤에서 끝나는 줄을 일치시키고 정렬합니다.
  • 두 개의 결과를 함께 결합

관련 정보