MAC 주소가 나열된 Wi-Fi 로그를 받고 있습니다. 내 라우터에 연결된 장치의 MAC 공급업체/제조업체를 알고 싶습니다. 2개의 파일이 있는데 그 중 하나에는 MAC의 처음 3옥텟을 표시하는 MAC "grep"이 있습니다. 또 다른 파일에는 공급업체 목록과 해당 릴리스의 처음 3옥텟이 포함되어 있습니다. 이제 문제는 첫 번째 파일에 중복 항목이 여러 개 있다는 것입니다. 두 번째 파일에서도 해당 중복 항목을 일치시킬 수 있지만 첫 번째 파일에 중복 항목이 몇 개 있는지는 표시되지 않습니다. 아래는 예시입니다.
텍스트.txt
00:10:f6
00:10:f6
03:48:03
8f:91:34
93:ab:c6
공급자.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
최종결과.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"
내가 생각하지 못한 플래그나 옵션이 있나요?
답변1
join
파일 병합(정렬된 입력 필요):
$ join <(sort text.txt) <(sort vendor.xml)
00:10:f6 vendor="micro"
00:10:f6 vendor="micro"
03:48:03 vendor="apple"
8f:91:34 vendor="dell"
93:ab:c6 vendor="sun"
이제 남은 것은 uniq -c
계산을 수행하기 위해 추가하는 것입니다.
$ join <(sort text.txt) <(sort vendor.xml) | uniq -c
2 00:10:f6 vendor="micro"
1 03:48:03 vendor="apple"
1 8f:91:34 vendor="dell"
1 93:ab:c6 vendor="sun"
답변2
awk의 답변은 다음과 같습니다.
awk 'NR==FNR {count[$0]++; next} $1 in count {print count[$1],$0}' text.txt vendor.xml | sort -nr
답변3
처음 두 명령은 아무 작업도 수행하지 않습니다. 이 두 파일을 캡처하여 grep에 전달합니다. grep은 검색할 파일을 제공했기 때문에 이를 무시합니다. 당신은 단지 필요
grep -Ff text.txt vendor.xml | sort -u | uniq -c
이는 예상한 대로 작동하지 않습니다. grep
그보다 더 똑똑하기 때문입니다. 찾을 패턴 목록을 제공하면 중복된 패턴은 무시됩니다. 이는 00:10:f6
다음의 두 줄에 대해 한 줄만 인쇄 한다는 의미입니다 text.txt
.
$ 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"