awk 使用文件作为模式列表过滤实时捕获

DMu*_*rta 4 awk text-processing tshark

我想要做的很简单。我正在生成输出tshark并将其重定向到awkpipe |。由于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
Run Code Online (Sandbox Code Playgroud)

为方便起见,我的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!
Run Code Online (Sandbox Code Playgroud)

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

12:34:56:78:90:10 -> You
Run Code Online (Sandbox Code Playgroud)

甚至更好:

Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
Run Code Online (Sandbox Code Playgroud)

编辑#1

好吧,我做了一些测试,发现tsharks 的输出是由tab\t分隔的。这不是什么大问题,但已经是一个小小的改进。问题是,我从tshark输出中获取了样本,并通过echo管道之前的命令使用 Gnoucs 回答进行了测试|。有效。然后我更改了echofortshark并且一切都停止了=)。

是实时数据的问题还是类似的问题?到目前为止,这是我的代码:

$ 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 -
Run Code Online (Sandbox Code Playgroud)

好吧,它刚刚奏效!这可能是一个错字。感谢所有的答案!

cuo*_*glm 5

尝试这个:

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

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

解释

  • -F[ ,\t]: 我们使用逗号、空格或制表符作为字段分隔符。
  • FNR == NR { a[$1] = $2 }:FNR == NR仅在处理第一个文件时为真。因此,对于 中的每一行target.txt,我们将第二个字段保存到关联数组中,第一个字段(MAC 地址)是索引。
  • ($NF in a): 当读取输入时(-target.txt导致awk从输入读取之后),如果最后一个字段在关联数组中a,我们打印所需的结果。