Eliminar todas las líneas que no tienen n caracteres antes del delimitador


11

Tengo un archivo de texto muy largo (desde aquí ) que debe contener 6 caracteres hexadecimales y luego un 'salto' (que aparece como un carácter y no parece mostrarse correctamente en el código de marcado a continuación) seguido de algunas palabras:

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

He echado un vistazo y no puedo ver algo que funcione en esta situación. Mi pregunta es, ¿cómo puedo usar grep/ sed/ awk/ perlpara eliminar todas las líneas de este archivo de texto que no comienzan con exactamente 6 caracteres hexadecimales y luego un 'salto'?

PD Para puntos de bonificación, ¿cuál es la mejor manera de ordenar el archivo alfabéticamente y numéricamente de acuerdo con los caracteres hexadecimales (es decir, 000000-> FFFFFF)? ¿Debo usar sort?

Respuestas:


13
$ 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

Esto se usa awkpara extraer las líneas que contienen exactamente seis dígitos hexadecimales en el primer campo. El [[:xdigit:]]patrón coincide con un dígito hexadecimal y {6}requiere seis de ellos. Junto con el anclaje al inicio y al final del campo con ^y $respectivamente, esto solo coincidirá en las líneas deseadas.

Redireccionar a algún archivo para guardarlo con un nuevo nombre.

Tenga en cuenta que esto parece funcionar con GNU awk(comúnmente encontrado en Linux), pero no con, awkpor ejemplo, OpenBSD o mawk.


Un enfoque similar con 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

En esta expresión, \>se usa para hacer coincidir el final del número hexadecimal. Esto asegura que los números más largos no coincidan. El \>patrón coincide con un límite de palabra , es decir, el espacio de ancho cero entre un carácter de palabra y un carácter que no es de palabra.


Para ordenar los datos resultantes, simplemente canalice el canal de resultado sort, o sort -fsi sus números hexadecimales usan letras mayúsculas y minúsculas


1
Perfecto, muchas gracias. ¡Exactamente lo que estaba buscando!
Rocco

8

Y para completar, también puede hacer esto con 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
$ 

Esta expresión grep extendida busca exactamente 6 dígitos hexadecimales al comienzo de cada línea, seguidos inmediatamente por un límite de no espacio en blanco a espacio en blanco ( \b).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.