デバイス名を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で2つの解決策を提案したいと思います。

ソリューション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

関連情報