웹 서버 액세스 로그에서 가장 활동적인 10 개의 IP 주소를 나열하는 한 줄 명령이 있습니다.
cat access.log | awk '{print $1}' | sort | uniq -c | sort -n | tail -n10
샘플 결과 집합 (단순화를 위해 3 개의 항목 만 있음)은 다음과 같습니다.
20 12.34.56.7
22 3.67.89.201
29 9.0.203.255
보시다시피, 카운트는 IP 주소보다 우선하며, 둘은 공백으로 구분됩니다. 실제로 카운트 앞에 공백이 있지만 여기에 표시 할 수는 없습니다.
다음과 같이 IP 주소의 역방향 DNS 조회를 수행하고 싶습니다.
20 12.34.56.7 (d12-34-56-7.abhsia.telus.net)
22 3.67.89.201 (customer.vpls.net)
29 9.0.203.255 (9-0-203-255.hlrn.qwest.net)
스크립트에 의존하지 않고 어떻게해야합니까 (즉, 한 줄 명령 만 사용)? 모든 조언을 부탁드립니다.
답변
dig +noall +answer -x <IP>
IP 주소를 조회하는 데 사용할 수 있습니다 .
IP 주소 목록이 포함 된 파일을 단순히 반복하려면 :
while read ip; do dig +noall +answer -x $ip; done < ips.txt
또는 카운팅 명령의 출력을 파이프합니다. 이번에는 카운트와 IP 주소를 별도로 얻은 다음 한 줄에 인쇄합니다.
cat access.log | awk '{print $1}' | sort |
uniq -c | sort -n | tail -n10 |
while read count ip; do printf "%d " $count; printf "%s " $ip; dig +noall +answer -x $ip; done
예 (UUOC에 대해 죄송합니다) :
cat test | while read count ip; do printf "%d " $count; printf "%s " $ip; dig +noall +answer -x $ip; done
20 8.8.8.8 8.8.8.8.in-addr.arpa. 52767 IN PTR google-public-dns-a.google.com.
22 8.8.4.4 4.4.8.8.in-addr.arpa. 61369 IN PTR google-public-dns-b.google.com.
dig
호스트 이름을 얻기 위해 awk로 출력을 추가로 파이프 할 수 있습니다 .
cat test | while read count ip; do printf "%d " $count; printf "%s " $ip; echo $(dig +noall +answer -x $ip | awk '{ print $(NF) }'); done
20 8.8.8.8 google-public-dns-a.google.com.
22 8.8.4.4 google-public-dns-b.google.com.