Estoy intentando realizar un grep en un archivo que contiene caracteres "NAK" (http://www.theasciicode.com.ar/ascii-control-characters/nak-negative-acknowledge-ascii-code-21.html).

Cuando abro el archivo con vi, este carácter NAK se muestra como "^ U". Intenté grep ^U myfile.csv pero no funciona.

¿Sabes cómo podría identificar este personaje para que coincida con el comando grep?

0
user7052012 18 ene. 2018 a las 19:08

3 respuestas

La mejor respuesta

Hagamos un pequeño archivo con los primeros 128 códigos ASCII para demostración:

perl -e 'for($i=0;$i<128;$i++){printf("%c",$i)}' > someFile

Y míralo en hexadecimal:

xxd someFile

00000000: 0001 0203 0405 0607 0809 0a0b 0c0d 0e0f  ................
00000010: 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f  ................
00000020: 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f   !"#$%&'()*+,-./
00000030: 3031 3233 3435 3637 3839 3a3b 3c3d 3e3f  0123456789:;<=>?
00000040: 4041 4243 4445 4647 4849 4a4b 4c4d 4e4f  @ABCDEFGHIJKLMNO
00000050: 5051 5253 5455 5657 5859 5a5b 5c5d 5e5f  PQRSTUVWXYZ[\]^_
00000060: 6061 6263 6465 6667 6869 6a6b 6c6d 6e6f  `abcdefghijklmno
00000070: 7071 7273 7475 7677 7879 7a7b 7c7d 7e7f  pqrstuvwxyz{|}~.

Ahora, si desea encontrar el NAK, (hex 15), la forma más fácil de verlo en contexto, es reagrupar el hex en bytes individuales (-g1) y luego buscar 15 con un límite de palabras al comienzo y al final, de modo que solo encuentre el 15 en la parte hexadecimal y no en el desplazamiento al comienzo de cada línea y no en la parte ASCII al final de cada línea:

xxd -g1 a | grep "\b15\b"

00000010: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................

Y ahora puedes verlo y los personajes que lo rodean. Para aclararlo un poco, imaginemos que estaba buscando A, que es el hex 41:

xxd -g1 a | grep "\b41\b"
00000040: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  @ABCDEFGHIJKLMNO

Ahora puede ver el 41 en el tercer campo y también las letras que rodean el A en la parte ASCII al final de la línea (lado derecho).


El otro método que encontrará NAK pero puede generar un desorden de caracteres de control es como dije en los comentarios:

grep -a $'\x15' someFile

Otro "truco" al buscar personajes de control es convertirlos en otro personaje y luego buscarlo. Por lo tanto, elija algo que no ocurra mucho en sus archivos, tal vez un | o un #, convierta sus NAK en eso y luego búsquelo.

Como ejemplo concreto, convierta sus NAK problemáticos en símbolos de tubería | y luego busquemos:

tr '\015' '|' < YourFile | grep -a '|'

O bien, supongamos que tiene ACK y NAK en su archivo, conviértalos a < y > y busque:

tr '\006\015' '<>' < YourFile | grep -Ea '<|>'
0
Mark Setchell 19 ene. 2018 a las 10:51

Intenté grep ^U myfile.csv pero no funciona.

Para seleccionar el carácter Control-U, no debe escribir la representación gráfica ^ U como patrón; escriba un Control-U literal en su lugar. Para hacer esto, debe precederlo con la tecla especial cita-insertada Control-V, i. mi. escriba Ctrl-V Ctrl - U .

1
Armali 19 ene. 2018 a las 07:36
#od -c can identify those non-printable character and represent them in octal

echo "$line"| od -c;
0
San 18 ene. 2018 a las 16:27