다음 코드를 실행하여 일부 IP 주소를 추출하고 고유성을 계산했습니다. 예를 들어
./my_program | awk '/^10./{a[$1 FS $2]++ } END { for(i in a) print i,a[i]}' > some_file
포함된 출력은 some_file
다음과 같습니다.
10.12.33.14 34
10.12.33.11 12
10.12.33.16 5
{system("dig +short -x " i)}
이제 내가 원하는 것은 파일이 다음과 같이 보이도록 출력을 실행하고 마지막 열에 추가하는 것입니다.
10.12.33.14 34 server1.rdns.domain.tld
10.12.33.11 12 server2.rdns.domain.tld
10.12.33.16 5 server3.rdns.domain.tld
이 작업을 한 번에 수행한 다음 출력을 텍스트 파일로 파이프할 수 있습니까?
감사해요!
업데이트 1
... END { for(i in a) cmd=sprintf("dig +short -x \"%s\"", $i); cmd | getline type; close(cmd); printf("%s %s %s\n",i,a[i],type);
이것이 출력의 끝입니다(stderr).
dig: '.in-addr.arpa.' is not a legal name (unexpected end of input)
파일에서 본 내용이에요
10.12.33.14 34
업데이트 2:
END { for(i in a) split(i,ip," ")
cmd=sprintf("dig +short -x \"%s\"", ip[1]); cmd | getline type; close(cmd);
printf("%s %s %s %s\n",ip[1],ip[2],a[i],type)
답변1
기능을 사용하여 IP/포트 조합을 분할하고 나중에 명령에서 사용할 수 split()
있도록 IP를 가져올 수 있습니다.dig()
END {
for(i in a) {
split(i, ip)
cmd=sprintf("dig +short -x \"%s\"", ip[1])
(cmd | getline type) > 0 ? "" : type="notResolved"
printf("%s %s %s\n",i,a[i],type);
close(cmd)
}
}
명령의 상태를 확인 dig
하고 ?
삼항 연산자를 사용하여 유형의 값을 업데이트하는 방법을 추가했습니다. 실패한 경우에는 'notResolved'
위의 문자열과 같은 자체 문자열을 추가하고 결과를 인쇄할 수 있습니다.
getline()
발신을 사용하는 것은 awk
호출을 사용하는 것과 다릅니다 system()
. 이 유형은 셸에서 실행하는 cmd | getline var
것처럼 파이프를 사용하며 각 호출은 명령에서 한 줄의 출력을 읽습니다. 그러나 이 명령은 내부적으로 실행된 명령의 출력을 얻는 방법을 제공하지 않습니다. 내부적으로 실행되는 명령에서 반환된 종료 코드에만 액세스할 수 있습니다.cmd
getline var
system()
PS 답변 섹션에 유용한 의견이 채택되었습니다.무루.
답변2
다음을 수행할 수 있습니다.
1 단계:
./my_program | awk '/^10./{a[$1]++ } END { for(i in a) print i,a[i]}' | tee some_file | xargs -I{} dig +short -x {} > some_file2
2 단계:
paste <(awk '{print $1}' some_file ) <(awk '{print $1}' some_file2 ) > result
원한다면 some_file
삭제할 수 있습니다 .some_file2
rm some_file some_file2
답변3
awk
완전히 피할 수도 있습니다 . 약간 느리지만(동일한 호출 수를 사용하더라도 dig
) 읽기는 더 쉬울 것입니다.
while read -r ip count
do
printf "%s %s %s\n" "$ip" "$count" "$(dig +short -x "$ip" | xargs)"
done < ipaddresses.txt