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进入awk. awk可以自己进行模式匹配 - 尝试awk '/not/ {print $2}'一下。

并且将 awk 管道传输到另一个 awk 中也是不必要的。这里你只需要给它一组字段分隔符(空格和.),而不是默认的空格作为分隔符:

awk -F'[ .]' '/not/ {print $2}'

for仅循环每一行的cat内容echo同样毫无意义。实际上,比毫无意义更糟糕的是 - 它速度慢,效率低,并且使每行都受到标准 shell 分词(对于这个特定的输入来说不是问题,但如果您认为这是一个很好的技术并在行的输入文件上使用它,则可能会出现问题可能包含空格等)。只需使用cat.

但你甚至不需要cat在这里使用。 tee将 stdin 复制到文件和 stdout - 即它就像一个奇特的版本,cat也将其输入复制到文件。

tee如中提到的使用αГsнιn 的回答,你的整个单行可以减少为:

for i in {1..255} ; do "host 10.1.9.$i" ; done | 
    awk -F'[ .]' '/not/ {print $2}' | 
    tee /tmp/flix

相关内容