두 문자로 나누고 awk를 한 번만 실행할 수 있나요?

두 문자로 나누고 awk를 한 번만 실행할 수 있나요?

ip a여러 IP 주소 및 인터페이스 상태 생성

나는 다음 을 통해 awk '/inet / {print $2}'IP와 서브넷을 얻었습니다.

wolf@linux:~$ ip a | awk '/inet / {print $2}'
127.0.0.1/8
10.10.0.1/24
10.10.1.1/24
wolf@linux:~$ 

그런 다음 CIDR 기호를 제거하기 위해 다른 awk로 파이프했습니다.

wolf@linux:~$ ip a | awk '/inet / {print $2}' | awk -F / '{print $1}'
127.0.0.1
10.10.0.1
10.10.1.1
wolf@linux:~$ 

awk 출력을 다른 awk로 파이프하지 않고도 이 작업을 수행할 수 있습니까?

원하는 출력

wolf@linux:~$ ip a | <awk syntax here without additional piping>
127.0.0.1
10.10.0.1
10.10.1.1
wolf@linux:~$ 

답변1

실제로 사용하도록 정의한 필드 구분 기호 -F는 정규식입니다. 따라서 다음 명령을 전달해야 합니다.

ip a | awk -F'[ /]+' '/inet / {print $3}'

답변2

ip a | awk '/inet / {FS="/"; $0=$2; print $1; FS=" "}'

첫 번째로 일치하는 레코드는 FS기본값(공백)을 기준으로 필드로 분할됩니다. 그런 다음 FS새 것을 설정하십시오. 교체하면 $0=$2새로운 것을 기준으로 다시 분할됩니다 FS. 이제 $1우리가 원하는 내용이 포함되었으므로 인쇄해 보겠습니다. 마지막으로 우리는 FS다음 일치 기록을 세웠습니다.

답변3

이 매우 구체적인 경우에 대해 더 나은 사용을 고려해 보셨습니까 ip? 예를 들어:

ip -j -p -f inet a | awk -F \" '/local/ {print $4}'

그러면 ip address키 검색이 localIP 주소를 저장하는 JSON 객체로 인쇄됩니다. 더 선명하게 하려면 다음을 사용할 수 있습니다 jq.

ip -j -p -f inet a | jq '.[].addr_info[].local'

ip addr출력 변경에 영향을 받지 않으므로 마지막 명령을 권장합니다 . 그러나 원래 디자인이 정말 마음에 든다면 다음을 선택하겠습니다.

ip a | awk '/inet / {print substr($2, 1, index($2,"/")-1)}'

또는

ip a | awk '/inet / {split($2, addr, "/"); print addr[1]}'

첫 번째 명령에서는 index($2, "/")해당 위치를 찾은 /다음 $2이를 사용하여 substr하위 문자열을 생성합니다. 몇 초 안에 우리는 그것을 분할 $2하여 배열 /에 저장합니다 .addr

답변4

/다음 문자를 빈 문자열로 바꿀 수 있습니다 .

ip a | awk '/inet /{ sub(/\/.*/, "", $2); print $2 }'

관련 정보