現在、ネットワークの一部のIPを提供する小さな断片があります。
#!/bin/bash
read -p "network:" network
data=$(nmap -sP $network | awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}')
次のIPアドレスを返します。
10.0.2.1
10.0.2.15
など。
今、私は彼らが次のように見えるようにしたいです。
10.0.2.1, 10.0.2.15, ...
私はbashの愚かな奴です。助けてください:)
答え1
区切り文字として正確に「、」が必要な場合は、次のものを使用できます。
echo "$data" | xargs | sed -e 's/ /, /g'
あるいは、カンマを区切り文字として使用すれば十分です。
echo "$data" | paste -sd, -
答え2
あなたできるコンマとスペースで区切られたIPアドレスのリストを返すようにスクリプトを変更します。awk
ただし、アイテムのリストを特定の区切り文字にリンクするのは一般的な作業であるため、再利用可能なツール(スクリプト、関数、コンパイル済みツール)プログラムを使用することをお勧めします。 、とにかく)これをやろうとします。
複数の言語(例:)perl
にはこれらの機能が組み込まれています。残念ながら、bashはそのうちの1つではありませんが、書くのはとても簡単です。
# perl-like join function for bash
join_by() {local d=$1; shift; printf '%s' "$1"; shift ; printf '%s' "${@/#/$d}"; echo;}
~/.bashrc
または に入れておくと~/.bash_profile
常に使えます。
これはPerljoin()
関数をモデル化しましたが、標準の手順(リンクファイルの行)join_by
と競合しないように名前が付けられています。join
最初のパラメータは区切り文字です。残りのすべてのパラメータは接続するデータです。
たとえば、
$ data=$'10.0.2.1\n10.0.2.15'
$ join_by ', ' $data
10.0.2.1, 10.0.2.15
この特別な使用法はお勧めできません。シェルの単語の分割に依存します。引用しない $data
スペースの変数(スペース、タブ、改行など)。これは可能であれば避けるべきです。出力はnmap
単一の文字列変数としてキャプチャされるため、ここに含めます。
代わりに配列を使用する必要があります。このように:
data=( $(nmap -sP "$network" | awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}') )
これにより、パイプから返された各IPアドレスが配列nmap | awk
の別々の要素に配置されます$data
。
以下は、次を使用して配列を接続する方法の人工的な例ですjoin_by
。
$ data=(10.0.2.1 10.0.2.15)
$ join_by ', ' "${data[@]}"
10.0.2.1, 10.0.2.15