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