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