我想做的事情很簡單。我正在生成輸出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:10
,awk
將輸出
12:34:56:78:90:10 -> You
甚至更好:
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
編輯#1
好吧,我做了一些測試,發現tshark
s 輸出是用tab
\t 分隔的。這不是什麼大問題,但已經是小小的進步了。問題是,我從tshark
輸出中獲取了樣本,並透過echo
管道先前的命令使用 Gnoucs 答案進行了測試|
。有效。然後我改變了echo
for 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