
내 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/^[^,]+,//'`
아이디어는 다음과 같습니다.
- 관련 필드를 각 줄의 시작 부분에 복사하고 특수 구분 기호(이 경우 쉼표)를 추가합니다.
sed
IP 주소의 옥텟 수에 따라 일부 값을 추가하는 데 사용됩니다 (4옥텟에는 0, 3옥텟에는 1을 사용했습니다).- 관련 필드의 값 정렬
- 추가한 모든 항목을 제거합니다.
답변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옥텟 뒤에서 끝나는 줄을 일치시키고 정렬합니다.
- 두 개의 결과를 함께 결합