grep は個々のパターンの数を計算します。

grep は個々のパターンの数を計算します。

MACアドレス(1行、区切り記号で:でソート)を含むファイルがあり、各MACアドレスがファイルに何回表示されるかを調べる必要があります。私はこれを修正しました:

grepを使用してディレクトリ内のすべてのファイルですべての単語の発生回数を計算する方法は?ただし、単語ごとの数はファイルごとに1回だけ増加します。

...そして少しずつ私はこれを得ます:

#!/bin/sh

grep -o -h -E '\w+' macadd | sort -u | \
while read word;
do
        # iterate through each word and find how many files it occurs
        c=`grep "$word" macadd | wc -l`
        echo "$c    $word";
done

次の出力が生成されます。

$ ./test.sh
12    00
84    08
6    09
36    0A
84    0B
1415    0C
4    10
6    12
68    13

...明らかに私が探しているわけではありません。ソースファイルから:を削除すると、次の結果が表示されます。

6    00EEBDA24AE1
3    10AE605A727A
6    2847AAC81C88
2    34C059B368DC
10    4C3C1655CD6A
1415    4C7F62310CD0
1    50CCF8BA10D7

...私が欲しいものを提供しますが、いくつかの理由で:区切り文字を維持したいと思います。テーブル出力を生成するために、最初の列の標準幅を持つことも良いでしょう。

6    00:EE:BD:A2:4A:E1
3    10:AE:60:5A:72:7A
6    28:47:AA:C8:1C:88
2    34:C0:59:B3:68:DC
10   4C:3C:16:55:CD:6A
1415 4C:7F:62:31:0C:D0
1    50:CC:F8:BA:10:D7

ここでどこに行くべきですか?

よろしくお願いします。

ベストアンサー1

必要なのはsort macadd | uniq -c@roaimaが説明した内容だけです。しかし、試したのと同じ方法を使って行う方法を指摘したかったのです。

ファイルを繰り返す理由はなく、次のgrep場所に直接供給できますwhile

while read mac; do echo "$mac"; done < macadd

また、一致を計算するオプションもgrepあります。-cしたがって、いくつかの小さな調整を使用すると、使用しているツールを使用して実行したいことができます。

$ while read mac; do 
    printf "%5s\t%s\n" $(grep -c "$mac" macadd) "$mac"; 
  done < <(sort -u macadd)
   6     00:EE:BD:A2:4A:E1
   3     10:AE:60:5A:72:7A
   6     28:47:AA:C8:1C:88
   2     34:C0:59:B3:68:DC
  10     4C:3C:16:55:CD:6A
1415     4C:7F:62:31:0C:D0
   1     50:CC:F8:BA:10:D7

これは単語文字と見なされず、一致しないためgrep失敗します。次のように使用できます。:\w

grep -ohE '[A-Z0-9:]+' macadd | sort -u 

grepしかし、自分で行うことができるので、必ずしも必要ではありませんsort(常にファイルにMACアドレスのみが含まれていると仮定)。

sort -u macadd | while read . . .

おすすめ記事