2015-02-23 97 views
1

我正在研究一個捕獲信標幀數據包(沒有錯誤的fcs)並以優選格式輸出它的bash腳本,但我遇到了將outptut重定向到文件的問題。將awk輸出重定向到bash中的文件

這是我的命令行當我重定向到一個文件名爲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.Pipe命令行輸出像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 
  • 我試過

    exec > temp command line above

  • 這是一個緩衝問題,因爲數據包捕獲很快?

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

    注: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" 
           } 
          } 
         } 
        } 
    } 
    

    正如我所說的代碼工作正常..這只是重定向問題..提供代碼的改進,如果需要的話。

    +1

    難道不是顯而易見的代碼不適合單線程?在你的問題中使用'awk -f script.awk'併發布'script.awk' - 正確縮進。 – hek2mgl 2015-02-23 22:13:53

    +0

    是的,我知道..我的錯誤在這裏..但腳本非常大..所以我嘗試了一些單線代碼(我的歉意) – repzero 2015-02-23 22:15:12

    +0

    只需改變它。這可能是一個upvote而不是downvote。 – hek2mgl 2015-02-23 22:15:50

    回答

    0

    在awk和gawk讀了一點之後..我遇到了一個非常有趣的話題,在我的文本之一緩衝行爲。這解決了我的問題..我改變了緩衝行爲AWK使用以下

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

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

    這迫使awk來立即刷新其輸出對每個輸入線。

    我在我的命令行中嘗試了上述每個函數,我的輸出立即被重定向到我的文件temp

    +0

    @ tripleee ..我嘗試了答案,但我需要等待24小時後...... – repzero 2015-02-24 10:35:29

    0

    可能不是答案,我沒有永遠使用bash,但可能嘗試將其發送到文本文件。臨時可能被視爲一個目錄。而不是嘗試執行> temp.txt

    +0

    不。UNIX中沒有任何東西關心像.txt這樣的文件擴展名。如果你願意,你可以命名一個目錄'temp.txt'並且不需要UNIX工具。 – 2015-02-23 23:12:07

    +0

    嘗試過但沒有結果.. + 1試圖幫助我 – repzero 2015-02-23 23:19:35