Linux AWK在bash中对正在运行的输出执行操作

Linux AWK在bash中对正在运行的输出执行操作,linux,bash,shell,awk,sed,Linux,Bash,Shell,Awk,Sed,我需要使用命令的输出,即: nmap -n -Pn -sS --vv <*IPs*> 但很明显,这是行不通的 有什么想法吗?给定此命令行: left-side | right-side 你的问题是: shell将缓冲任何发送到管道的命令的输出,因此在左侧命令完成运行之前,您可能不会在右侧命令中看到“未显示”,并且 您希望左侧命令在右侧命令看到“未显示”时立即停止运行 对于第一个问题,请使用或类似 对于第二种情况,退出右侧命令将向左侧命令发送终止信号,因此您不需要执行任何其他操作,

我需要使用命令的输出,即:

nmap -n -Pn -sS --vv <*IPs*>
但很明显,这是行不通的


有什么想法吗?

给定此命令行:

left-side | right-side
你的问题是:

  • shell将缓冲任何发送到管道的命令的输出,因此在左侧命令完成运行之前,您可能不会在右侧命令中看到“未显示”,并且
  • 您希望左侧命令在右侧命令看到“未显示”时立即停止运行
  • 对于第一个问题,请使用或类似

    对于第二种情况,退出右侧命令将向左侧命令发送终止信号,因此您不需要执行任何其他操作,您想要执行的操作将在退出右侧命令时发生

    因此,您的命令行类似于:

    nmap -n -Pn -sS --vv <*IPs*> |
    stdbuf awk '/Not shown/{exit} /^Discovered/{print $6}'
    
    nmap-n-Pn-sS-vv|
    stdbuf awk“/未显示/{exit}/^Discovered/{print$6}”
    

    idk,如果您想在示例代码中使用“未显示”或“Nmap扫描报告”。使用希望awk退出的字符串。

    大多数类型的awk都会进行缓冲。在gawk中没有选项可以执行您正在执行的操作,但是如果使用,您可以为它提供
    -Winteractive
    选项,该选项不缓冲

    顺便说一句,您正在运行两个AWK,但您只需要一个:

    nmap -n -Pn -sS --vv <*IPs*> | mawk -Winteractive '/Not shown/ {system("pkill nmap")} /^Discovered/{print $6}'
    
    nmap-n-Pn-sS--vv | mawk-Winteractive'/未显示/{system(“pkill nmap”)}/^Discovered/{print$6}
    

    awk中的每个谓词都运行关联的块。(虽然我喜欢awk,但这个用例可能更适合。)

    如果希望awk在看到行
    Nmap扫描报告时终止,那么只需将
    /^Nmap扫描报告/{exit}
    添加到awk脚本中即可。谢谢@William,但我仍然看不到我需要的IP地址。这只会停止命令,现在我该如何过滤我需要的IP?如果省略参数,哪个模式是
    stdbuf
    用于stdin/stdout?而且
    nmap
    可能/将缓冲其输出。它不需要第二个
    stdbuf
    来防止这种情况吗?无缓冲。idk nmap做了什么,idk关于它的输出缓冲,OP可以试试看(或谷歌…)。也许行缓冲(即stdbuf-iL-oL)在这个场景中是有意义的?可能是。让我们认为这是OP进一步研究的机会:-)我不认为<代码> AWK 自己正在进行缓冲。这种情况发生在glibc中,可能会受到stdbuf命令的影响。我没有看过nawk,但是gawk(参见io.c)和mawk(fin.c)似乎在内部进行缓冲。你怎么会认为
    gawk
    在io.c中处理io缓冲?
    nmap -n -Pn -sS --vv <*IPs*> | mawk -Winteractive '/Not shown/ {system("pkill nmap")} /^Discovered/{print $6}'