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