구분 기호 앞에 n 문자가 없는 모든 줄을 삭제합니다.

구분 기호 앞에 n 문자가 없는 모든 줄을 삭제합니다.

매우 긴 텍스트 파일이 있습니다(여기)에는 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?awkperl

000000PS 보너스 포인트를 얻으려면 FFFFFF16진수 문자(예: -> )를 기준으로 알파벳순과 숫자순으로 파일을 정렬하는 가장 좋은 방법은 무엇입니까? 그냥 사용해야합니까 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에서 일반적) 에서는 작동하는 것으로 보이지만 awkOpenBSD 또는 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 를 통해 결과를 파이프하거나 sort16 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)를 검색합니다.

관련 정보