bashスクリプトが最後のパイプファイルを読み取らない

bashスクリプトが最後のパイプファイルを読み取らない
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パイプを使用する理由はほとんどありませんawkawk自分でパターンマッチングを行うことができます。試してみてください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

関連情報