for i in {1..255} ; do host 10.1.9.$i ; done |grep not|awk '{print $2}' | awk -F. '{print $1}'> /tmp/filx | for i in `cat /tmp/filx` ; do echo $i ; done
なぜo / pが表示されないのかわかりません。ファイルに未使用のIP値があります。ありがとう
答え1
ファイルにのみリダイレクトするからです。次のコマンドに渡すには、tee
両方を実行します。
... | tee /tmp/filx |...
tee
ファイルに書き込み、|
標準入力から読み取って標準出力を次のコマンドに渡すために使用されます。
または、コマンドのこの部分を/tmp/filx |
またはに変更する必要があります。|
;
&&
答え2
grep
パイプを使用する理由はほとんどありませんawk
。 awk
自分でパターンマッチングを行うことができます。試してみてくださいawk '/not/ {print $2}'
。
そして、awkを別のawkにパイプすることは不要です。ここでは.
、区切り文字としてデフォルトのスペースの代わりにフィールド区切り文字セット(スペースと)を指定できます。
awk -F'[ .]' '/not/ {print $2}'
for
各行のcat
内容を繰り返すだけではecho
意味がありません。実際、それは無意味なものよりも悪いです。遅くて非効率的で、各行を標準のシェルトークン化に適用します(この特定の入力には問題ではありませんが、良い技術だと思い、行にスペースを含めることができる入力ファイルに使用する場合)cat
。
cat
しかし、ここでは使用する必要さえありません。 stdinをファイルとstdoutにコピーします。つまり、入力もファイルにコピーするtee
素晴らしいバージョンと同じです。cat
tee
記載されているようにαГsнιnの答え、単一ライン全体を次のように減らすことができます。
for i in {1..255} ; do "host 10.1.9.$i" ; done |
awk -F'[ .]' '/not/ {print $2}' |
tee /tmp/flix