次のような結果を返すコマンドがあります。
id1="172" id2="17" id3="136" id4="5" id5="0" />
id1="172" id2="17" id3="128" id4="2" id5="0" />
id1="172" id2="17" id3="128" id4="4" id5="0" />
id1="172" id2="17" id3="128" id4="6" id5="0" />
最初の 4 つの ID を組み合わせると、IP アドレスが表されます (例:172.17.136.5
最初の行)。
上記を解析コマンドにパイプして、すべての IP アドレスをスペースで区切った単一の文字列を出力したいと思います。
上記の例の場合:
myVariable="172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6"
これどうやってするの?
答え1
awk
これを最も簡単に実行できるのは、次のコマンドです。
your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}'
変数として設定するには、コマンド置換を使用します。
myVariable="$(your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
-F
入力フィールドの区切り文字 (デフォルトでは任意の空白) をカスタム値 (この場合は二重引用符 ( "
)) に設定します。
-v
変数を設定できますawk
。
OFS
出力フィールドの区切り文字で、デフォルトでは 1 つのスペースです。これをピリオドに設定します。
ORS
出力は記録区切り文字。デフォルトでは改行です。スペースに設定します。
次に、入力の各行の 2 番目、4 番目、6 番目、8 番目のフィールドを出力します。
サンプル出力:
$ cat temp
id1="172" id2="17" id3="136" id4="5" id5="0" />
id1="172" id2="17" id3="128" id4="2" id5="0" />
id1="172" id2="17" id3="128" id4="4" id5="0" />
id1="172" id2="17" id3="128" id4="6" id5="0" />
$ myVariable="$(cat temp | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
$ echo "$myVariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6
$
答え2
myvariable=$(yourmysterycommand |
sed -e 's/id1=//;
s/id5=.*//;
s/"//g;
s/id.=/./g;
s/[[:blank:]]\+//g' |
paste -sd' ')
これはワンライナーですが、読みやすくするために改行とインデントを追加して再フォーマットされています。
$ echo "$myvariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6
このsed
コマンドは、文字列 を削除しid1=
、id5=
その後に続くすべてのものを削除し、すべての二重引用符文字 ( "
) を削除し、 のすべての出現をid.=
リテラル に変更し.
、最後に行からすべての空白文字 (スペースやタブ) を削除します。
このpaste
コマンドは、スペース文字を区切り文字として行を結合します。
ところで、もっと良い解決策は、IP アドレスをそのような役に立たない愚かな形式で印刷しているプログラムを修正することです。IP アドレスのオクテットは、いかなる種類の「ID」でもありません。