문자열이 다른 열에 있을 수 있는 경우

문자열이 다른 열에 있을 수 있는 경우

IP의 처음 3개 옥텟을 기반으로 명명된 파일에서 awk 정보를 얻으려고 합니다. 이 파일에서 IP는 열 2 또는 열 4에 있을 수 있습니다. IP가 2열에 있으면 2열에 있는 내용을 인쇄한 다음 1열에 있는 내용을 인쇄하고 싶습니다. IP가 4열에 있으면 4열과 1열을 인쇄합니다. (서버 이름의 열 1).

다음은 모든 열을 인쇄하는 출력 예입니다.

awk /10.1.49/ /var/named/internal/Domain/abc.com

출력은 다음과 같습니다.

server01      IN      A       10.1.49.29  
server02      IN      A       10.1.49.80  
;globalname01.abc.com   10.1.49.60  
;globalname02.abc.com   10.1.49.61

IP 열을 기준으로 정렬한 다음 IP와 서버 이름을 인쇄하고 싶습니다.

10.1.49.20  server01  
10.1.49.60  globalname01.abc.com  
10.1.49.61  globalname02.abc.com  
10.1.49.80  server02  

나는 파일을 사용하여 열 수를 가져온 {print NF}다음 다시 읽어서 (필요한 경우) 정렬하는 방법을 알고 있습니다 .{print $4 $1}{print $2 $1}

답변1

노력하다:

$ awk '$NF~/^10\.1\.49/ {sub(/;/, "", $1); print $NF,$1}' file | sort
10.1.49.29 server01
10.1.49.60 globalname01.abc.com
10.1.49.61 globalname02.abc.com
10.1.49.80 server02

어떻게 작동하나요?

  • $NF~/^10\.1\.49/ {..}

    마지막 열이 로 시작하는 행이 선택됩니다 10.1.49. 이러한 줄의 경우 중괄호로 묶인 명령을 실행합니다.

  • sub(/;/, "", $1)

    중괄호 안의 첫 번째 명령은 대체 명령입니다. ;존재하는 경우 첫 번째 필드에서 제거됩니다.

  • print $NF,$1

    그러면 마지막 필드가 인쇄된 다음 (수정 가능) 첫 번째 필드가 인쇄됩니다.

  • sort

    그러면 출력이 정렬됩니다. IP 주소를 정렬하는 방법에는 여러 가지가 있으며 다양한 정렬 옵션을 사용하면 원하는 결과를 얻는 데 도움이 될 수 있습니다.

답변2

awk '{ if ($1 ~ /;.*/) { print $2, substr($1, 2); } else { print $4, $1; } }' file  | sort

산출:

10.1.49.29 server01
10.1.49.60 globalname01.abc.com
10.1.49.61 globalname02.abc.com
10.1.49.80 server02

관련 정보