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