次の例の文字列があるとします。
<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>
私の考えではタブレットこれ最初の数字 そしてこれ知的財産権次の形式を使用してください。
0 10.0.100.10
sed 's@^[^0-255]*\([0-255]\+\).*@\1@'
最初の()番号とIP(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
)を抽出する方法を知っていますが、その時1行で達成できるかどうか知りたいです。
答え1
すべての(整数)数値とすべてのIP(v4)アドレスが必要な場合は、grepを使用して正規表現に代替エントリを追加してください。
... | grep -oE '[0-9]+|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
これにより、1行に1つの値が印刷され、もちろん最後0
からキャプチャされます。ETH0
上記のような構造の数字とIPを含む入力行だけが必要な場合(他の構造は必要ありません)、たとえばsedを使用できます。
... | sed -nEe 's,.*<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>.*,\1 \2,p'
\1
そして、括弧内の最初と2番目のグループに対応することは、\2
明確さと怠惰のためにここにIPを一致させました。[0-9.]+
またはPerlでも同様です:
... | perl -ne 'print "$1 $2\n" if m,<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>,'
答え2
数字以外の文字(「.」ではない)をすべて空白に置き換えると、最初と2番目の列を印刷できます。
echo '<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>' | \
sed -re 's;[^0-9.]; ;g' | \
awk '{print $1,$2}'
出力:
0 10.0.100.10
PS:「.」がある場合は、より複雑にする必要があります。 IPだけでなく他の場所でも同様です。
答え3
使用xq
(からhttps://kislyuk.github.io/yq/)、入力が実際に質問の単一のXMLノードであると仮定します。
xq -r 'to_entries[] | [ (.key|ltrimstr("ETH")|rtrimstr("_IP")), .value ] | @tsv' file.xml
これはXML文書をJSONに変換し、タグ名ETH
の先頭と末尾を_IP
削除して残りのタグ名を抽出します。 IPアドレスも抽出され、結果の2つの値がタブ区切りリストとして出力されます。
ltrimstr()
呼び出しは、rtrimstr()
ラベル名から数字以外のすべての文字を削除するorに置き換えることができます。gsub("[^[:digit:]]"; ""))
gsub("\\D"; ""))
中間JSONドキュメントは次のとおりです。
{
"ETH0_IP": "10.0.100.10"
}
...最終出力は次のとおりです。
0 10.0.100.10