将 awk 输出重定向到 bash 中的文件

redirecting awk output to file in bash

我正在编写一个 bash 脚本来捕获信标帧数据包(没有错误的 fcs)并以首选格式输出它们,但是我在将输出重定向到文件时遇到问题。

这是我重定向到名为 temp

的文件时的命令行
tcpdump -I -i mon0 -vv 2>/dev/null|awk -F ',| ' 'BEGIN{printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."};[=11=]~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ([=11=]~/CH:/) && !([=11=]~/tsft bad-fcs/)){NR=++c;arr[$i]=1;gsub(/\(|\)/,"",$i);printf("%-10s %-25s",NR,$i);for(x=1;x<=NF;++x){if($x~/^CH:/){print $x " "$(x+1) "\tHit Ctrl+C to stop scan"}}}}}' >> temp

当我没有重定向到文件时,上面的命令行在终端中工作正常(显示输出)。当我重定向到一个文件时,我看到该文件存在但没有输出。

我尝试了以下方法

1.Pipe 命令行输出如 tee -a temp(输出到标准输出和文件)

例子

tcpdump -I -i mon0 -vv 2>/dev/null|awk -F ',| ' 'BEGIN{printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."};[=12=]~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ([=12=]~/CH:/) && !([=12=]~/tsft bad-fcs/)){NR=++c;arr[$i]=1;gsub(/\(|\)/,"",$i);printf("%-10s %-25s",NR,$i);for(x=1;x<=NF;++x){if($x~/^CH:/){print $x " "$(x+1) "\tHit Ctrl+C to stop scan"}}}}}'|tee -a temp
  1. 我试过了

    exec > temp command line above

由于数据包捕获速度很快,这可能是一个缓冲问题吗?

如何将上述命令行的结果重定向到文件中?

注意:命令行中的mon0代表我在无线适配器上使用airmon-ng

启动的监控界面

编辑:代码细分如下

BEGIN {
    FS=",| "
    printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."
}
[=13=]~/Beacon/ {
    for(i=1;i<=NF;++i) {
        if(($i~/^\([^^]+\)$/) && !($i in arr) && ([=13=]~/CH:/) && !([=13=]~/tsft bad-fcs/)) {
            NR=++c
            arr[$i]=1
            gsub(/\(|\)/,"",$i)
            printf("%-10s %-25s",NR,$i)
            for(x=1;x<=NF;++x) {
                if($x~/^CH:/) {
                    print $x " "$(x+1) "\tHit Ctrl+C to stop scan"
                }
            }
        }
    }
}

正如我提到的,代码工作正常。这只是重定向问题。如果需要,请提供对代码的改进。

可能不是答案,而且我一直没有使用 bash,但可能会尝试将其发送到文本文件。 temp 可以被视为一个目录。而是尝试 exec > temp.txt

在阅读了一些 awk 和 gawk 之后......我在我的一篇文章中遇到了一个关于缓冲行为的非常有趣的话题 text.This 解决了我的问题......我使用以下方法更改了 awk 的缓冲行为

fflush("") ==> gawk and newer versions of awk

system("")==> older versions of awk

这会强制 awk 立即为每个输入行刷新其输出。

我在命令行中尝试了上述每个功能,我的输出立即重定向到我的文件 temp