私がしたいことは簡単です。出力を生成tshark
し、それをawk
パイプにリダイレクトしています|
。tshark
リアルタイムデータを取得しているので、各出力awk
でファイルの最初の列("target.txt")(すでに持っている一部のMACアドレス)のパターンを検索し、一致するものがあれば最初と出力する必要があるawk
ファイルの2番目の列です。
次の例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アドレス列は2番目の列です。
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
最初のファイルを処理するときにのみTrueです。したがって、各行に対してtarget.txt
2番目のフィールドを連想配列に格納し、最初のフィールド(MACアドレス)はインデックスです。($NF in a)
:入力を読み取るとき(入力から読み取った後)、最後のフィールドが関連配列にある場合は、目的の-
結果を印刷します。target.txt
awk
a