grep은 개별 패턴의 수를 계산합니다.

grep은 개별 패턴의 수를 계산합니다.

MAC 주소(1/라인, 구분 기호로 :로 정렬)가 포함된 파일이 있는데 각 MAC 주소가 파일에 몇 번 나타나는지 알아내야 합니다. 나는 이것을 수정했습니다 :

grep을 사용하여 디렉토리의 모든 파일에서 모든 단어의 발생 횟수를 계산하는 방법은 무엇입니까? 그러나 단어당 개수는 파일당 한 번만 증가합니다.

...그리고 조금씩 나는 이것을 얻습니다:

#!/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 . . .

답변2

이 시도

sort macadd | uniq -c

관련 정보