MACアドレスが記載されているwifiログを取得しています。ルーターに接続されているデバイスのMACベンダー/メーカーを知りたいのですが。 2つのファイルがあります。1つはMACの最初の3オクテットを表示するために、すでに「grep」を使用しています。もう1つのファイルには、ベンダーとそれらが発行された最初の3オクテットのリストが含まれています。現在のところ、最初のファイルに複数の重複があり、2番目のファイルでも一致する可能性がありますが、最初のファイルからの重複の数は表示されません。以下に例を示します。
text.txt
00:10:f6
00:10:f6
03:48:03
8f:91:34
93:ab:c6
vendor.xml
03:48:03 vendor="Apple"
00:10:f6 vendor="micro"
8f:91:34 vendor="Dell"
93:ab:c6 vendor="Sun"
23:8b:23 vendor="Acer"
00:73:ad vendor="asus"
これは、次のコードを実行したときに得られるものです。
cat text.txt vendor.xml |grep -Ff text.txt vendor.xml |sort -u |uniq -c >> final.txt
final.txt
1 00:10:f6 vendor="micro"
1 03:48:03 vendor="Apple"
1 8f:91:34 vendor="Dell"
1 93:ab:c6 vendor="Sun"
結果は代わりになります:
2 00:10:f6 vendor="micro"
1 03:48:03 vendor="Apple"
1 8f:91:34 vendor="Dell"
1 93:ab:c6 vendor="Sun"
私が考えていないフラグやオプションはありますか?
これがawkの答えです:
awk 'NR==FNR {count[$0]++; next} $1 in count {print count[$1],$0}' text.txt vendor.xml | sort -nr
最初の2つのコマンドは何もしていません。 2つのファイルをキャットし、検索するファイルを指定したため無視しているgrepに渡します。必要なのは
grep -Ff text.txt vendor.xml | sort -u | uniq -c
grep
はそれよりも賢いので、それはあなたが期待したようには機能しません。探すパターンのリストを指定すると、重複は無視されます。これは、00:10:f6
の2つのtext.txt
に対して1行しか出力しないことを意味します。
$ grep -Ff text.txt vendor.xml
03:48:03 vendor="Apple"
00:10:f6 vendor="micro"
8f:91:34 vendor="Dell"
93:ab:c6 vendor="Sun"
あなたがやろうとしていたことに関しては、他の人がすでにあなたに非常に良い提案をしてくれましたが、これがPerlのものです:
$ Perl -lane '$#F>0 ? $k{$F[0]} && print "$k{$F[0]} $_" : $k{$_}++;' text.txt vendor.xml
1 03:48:03 vendor="Apple"
2 00:10:f6 vendor="micro"
1 8f:91:34 vendor="Dell"
1 93:ab:c6 vendor="Sun"