매우 긴 텍스트 파일이 있습니다(여기)에는 6개의 16진수 문자가 포함되어야 하며, "break"(한 문자로 표시되며 아래 코드 마크다운에서는 올바르게 표시되지 않는 것 같음)와 몇 개의 단어가 포함되어야 합니다.
00107B Cisco Systems, Inc
00906D Cisco Systems, Inc
0090BF Cisco Systems, Inc
5080 Cisco Systems, Inc
0E+00 ASUSTek COMPUTER INC.
000C6E ASUSTek COMPUTER INC.
001BFC ASUSTek COMPUTER INC.
001E8C ASUSTek COMPUTER INC.
0015F2 ASUSTek COMPUTER INC.
2354 ASUSTek COMPUTER INC.
001FC6 ASUSTek COMPUTER INC.
60182E ShenZhen Protruly Electronic Ltd co.
F4CFE2 Cisco Systems, Inc
501CBF Cisco Systems, Inc
나는 주위를 둘러보았고 이 경우에 효과가 있는 것을 아무것도 보지 못했습니다. 제 질문은 grep
///를 사용하여 이 텍스트 파일에서 "break" 뒤에 6개의 16진수 문자로 시작하지 않는 모든 줄을 삭제하려면 어떻게 해야 합니까 sed
?awk
perl
000000
PS 보너스 포인트를 얻으려면 FFFFFF
16진수 문자(예: -> )를 기준으로 알파벳순과 숫자순으로 파일을 정렬하는 가장 좋은 방법은 무엇입니까? 그냥 사용해야합니까 sort
?
답변1
$ awk '$1 ~ /^[[:xdigit:]]{6}$/' file
00107B Cisco Systems, Inc
00906D Cisco Systems, Inc
0090BF Cisco Systems, Inc
000C6E ASUSTek COMPUTER INC.
001BFC ASUSTek COMPUTER INC.
001E8C ASUSTek COMPUTER INC.
0015F2 ASUSTek COMPUTER INC.
001FC6 ASUSTek COMPUTER INC.
60182E ShenZhen Protruly Electronic Ltd co.
F4CFE2 Cisco Systems, Inc
501CBF Cisco Systems, Inc
awk
이는 첫 번째 필드에 정확히 6개의 16진수 숫자가 포함된 행을 추출하는 데 사용됩니다 . 패턴 [[:xdigit:]]
은 16진수 숫자와 일치하며 {6}
6개가 필요합니다. 필드의 시작과 끝을 각각 사용하고 고정하는 것과 함께 ^
필요한 $
행만 일치합니다.
새 이름으로 저장하려면 파일로 리디렉션하세요.
awk
이는 GNU (Linux에서 일반적) 에서는 작동하는 것으로 보이지만 awk
OpenBSD 또는 mawk
.
유사한 방법 sed
:
$ sed -n '/^[[:xdigit:]]\{6\}\>/p' file
00107B Cisco Systems, Inc
00906D Cisco Systems, Inc
0090BF Cisco Systems, Inc
000C6E ASUSTek COMPUTER INC.
001BFC ASUSTek COMPUTER INC.
001E8C ASUSTek COMPUTER INC.
0015F2 ASUSTek COMPUTER INC.
001FC6 ASUSTek COMPUTER INC.
60182E ShenZhen Protruly Electronic Ltd co.
F4CFE2 Cisco Systems, Inc
501CBF Cisco Systems, Inc
이 표현식에서는 \>
16진수의 끝과 일치합니다. 이는 다음을 보장합니다.더 길게숫자가 일치하지 않습니다. 이 \>
패턴은 다음과 일치합니다.단어 경계, 단어 문자와 단어가 아닌 문자 사이의 너비가 0인 공백입니다.
결과 데이터를 정렬하려면 trough 를 통해 결과를 파이프하거나 sort
16 sort -f
진수에 대문자와 소문자를 모두 사용하는 경우
답변2
완전성을 위해 grep을 사용하여 이 작업을 수행할 수도 있습니다.
$ grep -E '^[[:xdigit:]]{6}\b' oui.txt
00107B Cisco Systems, Inc
00906D Cisco Systems, Inc
0090BF Cisco Systems, Inc
000C6E ASUSTek COMPUTER INC.
001BFC ASUSTek COMPUTER INC.
001E8C ASUSTek COMPUTER INC.
0015F2 ASUSTek COMPUTER INC.
001FC6 ASUSTek COMPUTER INC.
60182E ShenZhen Protruly Electronic Ltd co.
F4CFE2 Cisco Systems, Inc
501CBF Cisco Systems, Inc
$
이 확장된 grep 표현식은 각 줄의 시작 부분에서 정확히 6개의 16진수 숫자와 공백이 아닌 공백 경계( \b
)를 검색합니다.