awk에서 system() 함수를 사용하여 첫 번째 열에서 명령을 실행합니다.

awk에서 system() 함수를 사용하여 첫 번째 열에서 명령을 실행합니다.

다음 코드를 실행하여 일부 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것처럼 파이프를 사용하며 각 호출은 명령에서 한 줄의 출력을 읽습니다. 그러나 이 명령은 내부적으로 실행된 명령의 출력을 얻는 방법을 제공하지 않습니다. 내부적으로 실행되는 명령에서 반환된 종료 코드에만 액세스할 수 있습니다.cmdgetline varsystem()

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_file2rm 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

관련 정보