Questão Como grep para caracteres especiais NUL (^ @ ^ @ ^ @)


Arquivo:

O000000667520994000000074720121112000000N^@^@^@ 

Eu usei o comando abaixo, mas não funciona.

grep "^@^@^@" *

20


origem




Respostas:


Você pode grep para quaisquer caracteres incluindo caracteres de controle / não imprimíveis no modo perl-regexp (-P) pelo seu código hexadecimal:

grep -Pa '\x00' ...

36



Você pode querer adicionar -a opção, caso contrário grep acha que são dados binários e não exibirão as linhas correspondentes. - mpy
Não consigo encontrar uma maneira de verificar se o arquivo contém apenas ASCII = 0 bytes ... grep -Pv '\x00' file não funciona no Cygwin ... - pbies


^@ não é um quilate ^ e arroba @é um personagem. É como alguns programas exibem o caractere NUL - valor ASCII 0, também conhecido como \0 em C.

Aqui eu criei um arquivo com um byte NUL. Observe que eu uso cat -v para mostrar caracteres não imprimíveis.

$ cat -v blah
hello
null^@
hi
$ hexdump -C blah
00000000  68 65 6c 6c 6f 0a 6e 75  6c 6c 00 0a 68 69 0a     |hello.null..hi.|
0000000f

Grep tem dificuldade em encontrar NULs, uma vez que eles são usados ​​para finalizar strings em C. Sed, no entanto, pode fazer o trabalho:

$ sed -n '/\x0/p' blah
null
$ sed -n '/\x0/p' blah | cat -v
null^@

 No vi, no modo de inserção, pressione Ctrl-V, Ctrl-Mudança-@ para inserir um byte nulo.


9





E se grep -P não funciona (por exemplo, no OS X), tente isto:

grep -E '\x00' ...

2



Tem certeza de que isso funciona? Eu não faço com a minha versão: grep (GNU grep) 2.14 - guettli
Esta resposta é para o BSD grep, tente a melhor resposta para o GNU grep: grep -Pa '\x00' ... - robinst


No bash você pode adicionar caracteres especiais quando prefixado com C-q ou C-v. Então você pode, por exemplo

grep 'Ctrl-vCtrl-a' file.txt

A cadeia de pesquisa deve ser lida como control key + character v, Seguido por control key + character a, que procura por valor ASCII SOH (01). Infelizmente isso não funciona para o caractere NUL.


1



Presumivelmente, você não quer realmente dizer que uma seqüência de caracteres como essa deve ser escrita literalmente, mas sim digitada logicamente no teclado? - Lightness Races in Orbit
Sim, claro. Esta é a tecla de controle pressionada, pressione v e mantenha pressionada a tecla Control, pressione a. - Olaf Dietsche
Eu acho que não está claro em sua resposta. - Lightness Races in Orbit
@LightnessRacesinOrbit Obrigado pela dica. Eu tentei esclarecer na resposta. - Olaf Dietsche
@ JohnKugelman Obrigado pela edição. Parece que eu deveria ter procurado a ajuda mais de perto. - Olaf Dietsche


O caractere ^ @ é o caractere NUL, portanto, receio que ele não possa ser obtido diretamente.

Sua melhor opção seria provavelmente escrever um programa simples que procura por essa seqüência de bytes.

Como alternativa, você pode tentar convertê-lo em alguma forma de depósito hexadecimal (od, xxd ou assim) e grep na saída dele. Mas francamente falando, seria complicado acertar.


-1





^ @ é o caractere NUL. O que você quer fazer com as linhas de seus arquivos que o contêm?

Você poderia dar uma olhada https://stackoverflow.com/questions/2398393/identifying-and-removing-null-characters-in-unix que lida com um problema semelhante.


-1