awk 使用檔案作為模式清單過濾即時捕獲

awk 使用檔案作為模式清單過濾即時捕獲

我想做的事情很簡單。我正在生成輸出tshark並將其重定向到awk管道|。由於tshark獲取即時數據,我希望awk在每個輸出中搜尋文件(“target.txt”)第一列中的模式(我已經擁有的一些 MAC 位址),並且如果存在匹配,awk則應輸出第一個和該文件的第二列。

範例來自target.txt

ab:cd:ef:gh:ij:kl,Me
12:34:56:78:90:10,You
1b:2d:3f:4h:5j:6l,someone

為了讓這一切變得更簡單,我的tshark輸出只有 2 列,MAC 位址列是第二列。

1行輸出tshark如下:

Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 
           ^^^^- date and MAC are separated by tab!

所以如果tshark找到12:34:56:78:90:10awk將輸出

12:34:56:78:90:10 -> You

甚至更好:

Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You

編輯#1

好吧,我做了一些測試,發現tsharks 輸出是用tab\t 分隔的。這不是什麼大問題,但已經是小小的進步了。問題是,我從tshark輸出中獲取了樣本,並透過echo管道先前的命令使用 Gnoucs 答案進行了測試|。有效。然後我改變了echofor tshark,一切都停止工作了 =)。

是即時數據的問題還是類似的問題?到目前為止,這是我的程式碼:

$ tshark -I -i wlan0 -T fields -e radiotap.dbm_antsignal -e wlan.sa | awk -F'[ ,\t]' '
     FNR == NR { a[$1] = $2 }
     ($NF in a) { print $0" -> "a[$NF] }
 ' alvos.txt -

好吧,它剛剛起作用了!這可能是個錯字。感謝您的所有回答!

答案1

嘗試這個:

$ awk -F'[ ,\t]' '
    FNR == NR { a[$1] = $2 }
    ($NF in a) { print $0" -> "a[$NF] }
' target.txt -

例子:

$ awk -F'[ ,\t]' '
    FNR == NR { a[$1] = $2 }
    ($NF in a) { print $0" -> "a[$NF] }
' target.txt -
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 # Ctrl + D here
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You

解釋

  • -F[ ,\t]:我們使用逗號、空格或製表符作為欄位分隔符號。
  • FNR == NR { a[$1] = $2 }FNR == NR僅在處理第一個文件時為真。因此,對於 中的每一行target.txt,我們將第二個欄位儲存到關聯數組中,第一個欄位(MAC 位址)是索引。
  • ($NF in a):讀取輸入時(-target.txt導致awk從輸入讀取之後),如果最後一個欄位位於關聯數組中a,我們將列印所需的結果。

答案2

如果我理解正確,其中任何一個至少都會產生您想要的輸出:

${TSHARK} |
sed -n "$(IFS=',
';  printf '/%s/s//& -> %s/p\n' \
        $(cat target.txt)
)"


${TSHARK} | 
sed -n "$(
   sed 's/,/|s||\& -> /
        s/.*/\\|&|p/
   ' <target.txt
)"

我通過以下方式對此進行了測試:

printf 'ab:cd:ef:gh:ij:kl,Me
12:34:56:78:90:10,You
1b:2d:3f:4h:5j:6l,someone' >./target.txt

printf 'Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10' |
sed ...

這是我的輸出:

Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You

答案3

#!/usr/bin/env awk
# filename ~/mac-lookup.awk

function load_mac_list (filename, array) {
    while ((getline line < filename) > 0) {
        split(line, fields, ",");
        array[fields[1]] = fields[2];
    }
    close(filename)
}

BEGIN {
    load_mac_list("target.txt", mac_list);
}

($5 in mac_list) {
    print $0 " -> " mac_list[$5];
    next;
}

{
    print;   # remove this line to avoid printing unmatched lines
}

這是蠻力方法。載入目標文件,然後僅當 mac 位址在清單中時才列印 mac 別名。

請注意,在這種情況下,「target.txt」是硬編碼在 awk 腳本中的。在 Gnouc 的回答中,您可以根據需要編寫目標清單檔案名稱的腳本。

用法

$ ${TSHARK} | awk -f ~/mac-lookup.awk
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
Jun 16, 2014 02:55:51.300286010 zy:xw:vu:ts:rq:po
Jun 16, 2014 02:55:51.300286020 ab:cd:ef:gh:ij:kl -> Me

相關內容