ファイルをパターンリストとして使用するawkフィルタライブキャプチャ

ファイルをパターンリストとして使用するawkフィルタライブキャプチャ

私がしたいことは簡単です。出力を生成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

まあ、私はいくつかのテストを行い、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最初のファイルを処理するときにのみTrueです。したがって、各行に対してtarget.txt2番目のフィールドを連想配列に格納し、最初のフィールド(MACアドレス)はインデックスです。
  • ($NF in a):入力を読み取るとき(入力から読み取った後)、最後のフィールドが関連配列にある場合は、目的の-結果を印刷します。target.txtawka

答え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

関連情報