在awash中将awk输出重定向到文件

时间:2015-02-23 22:11:38

标签: linux bash redirect awk tcpdump

我正在处理一个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."};$0~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ($0~/CH:/) && !($0~/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.管理命令行输出,如tee -a temp(输出到stdout和文件)

例如

tcpdump -I -i mon0 -vv 2>/dev/null|awk -F ',| ' 'BEGIN{printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."};$0~/Beacon/{for(i=1;i<=NF;++i){if(($i~/^\([^^]+\)$/) && !($i in arr) && ($0~/CH:/) && !($0~/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

  2. 这可能是一个缓冲问题,因为数据包捕获很快?

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

    注意:命令行中的mon0表示我使用airmon-ng在我的无线适配器上启动的监视器界面

    编辑:代码细分如下

    BEGIN {
        FS=",| "
        printf "%-10s %-25s%-10s\n","OPTION NO.","ESSID(Beacon Frames)","CHANNEL NO."
    }
    $0~/Beacon/ {
        for(i=1;i<=NF;++i) {
            if(($i~/^\([^^]+\)$/) && !($i in arr) && ($0~/CH:/) && !($0~/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"
                    }
                }
            }
        }
    }
    

    正如我所提到的,代码工作得很好..这只是重定向问题..如果需要,可以对代码进行改进。

2 个答案:

答案 0 :(得分:0)

可能不是答案,我没有永远与bash合作,但可能尝试将其发送到文本文件。 temp可以被视为目录。相反,尝试exec&gt; TEMP.TXT

答案 1 :(得分:0)

在对awk和gawk进行了一些阅读之后。我在我的一篇文章中遇到了一个关于缓冲行为的非常有趣的话题。这解决了我的问题..我使用以下内容改变了awk的缓冲行为

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

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

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

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