구분 기호 앞에 n 문자가없는 모든 행을 삭제하십시오. INC. 001BFC ASUSTek COMPUTER INC. 001E8C

나는 매우 긴 텍스트 파일 ( 여기에서 )에 6 개의 16 진수 문자를 포함하고 ‘중단'(한 문자로 표시되고 아래 코드 마크 다운에 올바르게 표시되지 않는 것)과 몇 단어가 있어야합니다.

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/ sed/ awk/ perl를 사용 하여 정확히 6 개의 16 진수 문자로 시작하지 않고 ‘중단’으로 시작하지 않는이 텍스트 파일의 모든 줄을 어떻게 삭제할 수 있습니까?

추신 보너스 포인트의 경우 파일을 16 진수 문자 (예 : 000000-> FFFFFF) 에 따라 알파벳 및 숫자로 정렬하는 가장 좋은 방법은 무엇입니까? 그냥 사용해야 sort합니까?



답변

$ 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}그 중 여섯이 필요합니다. 함께와 필드의 시작과 끝을 고정으로 ^하고 $각각이 만 원 선에 일치합니다.

일부 파일로 리디렉션하여 새 이름으로 저장하십시오.

이것은 GNU awk(일반적으로 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 진수의 끝을 일치시키는 데 사용됩니다. 이렇게하면 더 긴 숫자가 일치하지 않습니다. \>패턴은 일치하는 단어 경계 , 즉 단어 문자와 단어가 아닌 문자 사이의 제로 폭 공간을.


결과 데이터를 정렬하려면 결과 trough를 파이프 sort하거나 sort -f16 진수가 대문자와 소문자를 모두 사용하는 경우


답변

그리고 완전성을 위해 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)가 옵니다 .


답변