장치 이름을 grep하고 다음 값을 찾으십시오.

장치 이름을 grep하고 다음 값을 찾으십시오.

find 명령의 출력이 있습니다.

abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23

그 중 abc, def, geh는 장치 이름이며 길이에는 제한이 없으며 나머지는 장치에 속한 IP 주소입니다. abc,10.11.13.14장비와 똑같 습니다 abc. IP는 쉼표 구분 기호 옆에 있어야 합니다.

장치 이름을 찾기 위해 grep을 사용할 때 sed, grep 또는 awk를 사용하여 관련 IP를 어떻게 인쇄합니까? 즉, 장치 이름 옆에 IP가 표시되기를 원합니다.

답변1

저는 awk에 더 익숙하므로 awk에서 두 가지 솔루션을 제안하고 싶습니다.

솔루션 1

$ echo abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23 | awk -F, '{for (i=1; i<NF; i+=2) if ($i == "def") print $(i+1)}'
1.2.3.4

이 경우에는 컴퓨터 이름 "def"를 찾고 있으며, 발견되면 다음 열을 인쇄합니다.

솔루션 2

$ echo abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23 | tr , \\n | awk '/def/ {getline;print}'
1.2.3.4

이 솔루션에서는 tr명령을 사용하여 쉼표를 새 줄로 변환하고 "def"를 검색한 후 다음 줄을 인쇄합니다. 이 솔루션이 귀하에게 도움이 되기를 바랍니다.

답변2

Perl 호환 정규식을 사용하는 GNU grep이 있다고 가정합니다.

device="def"
grep -oP '(?<=\b'"$device"',).*?(?=,|$)'

이는 다음을 의미합니다. 한쪽의 "def"와 다른 쪽의 "쉼표 또는 줄 끝" 사이의 항목을 찾습니다.

편집: 주어진 장치를 보다 정확하게 찾기 위해 RE에 단어 경계를 추가했습니다.

답변3

쉘 내장 명령을 제외하고는 어떤 명령도 사용하지 마십시오:

string='abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23'
dev=def

s=,$string,
case $s in
  (*,"$dev",*) ip=${s#*",$dev,"}; ip=${ip%%,*};;
  (*) ip=unknown
esac

printf '%s\n' "$ip"

zsh를 사용하면 이 문자열을 연관 배열에 쉽게 매핑할 수 있습니다.

string='abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23'
typeset -A ip
ip=(${(s:,:)string})
print -r -- $ip[def]

답변4

[0-9\.]\{7,15\}sed를 사용하여 각 IP 주소를 바꾸십시오. IP 주소는 7~15자리 숫자와 점으로 구성됩니다.

각 IP 주소를 자체적으로 바꾸고 그 뒤에 newline을 입력합니다 \n. 이는 기본적으로 각 장치, IP 조합에 자체 줄이 있음을 의미합니다.

echo "abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23" | sed 's/\([0-9\.]\{7,15\}\),/\1\n/g' 
abc,10.11.13.14
def,1.2.3.4
geh,6.7.54.23


echo "abc,10.11.13.14,def,1.2.3.4,geh,6.7.54.23" | sed 's/\([0-9\.]\{7,15\}\),/\1\n/g'  | grep def
def,1.2.3.4

관련 정보