Como grep para caracteres especiais NUL (^ @ ^ @ ^ @)

26

Arquivo:

O000000667520994000000074720121112000000N^@^@^@ 

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

grep "^@^@^@" *

fonte

Respostas:

52

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

grep -Pa '\x00' ...
Hóspede
fonte
5
Você pode querer adicionar a -aopção, caso contrário, grepconsidera dados binários e não exibirá as linhas correspondentes.
M26:
Não consigo encontrar uma maneira de verificar se o arquivo contém apenas ASCII = 0 bytes ... grep -Pv '\x00' filenão funciona no Cygwin ...
pbies
@py Sem -a(às vezes?), ele nem encontra o padrão. Obrigado! Pode ajudar os @pbies também.
Michel de Ruiter 21/11
13

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

Aqui eu criei um arquivo com um byte NUL. Observe que eu uso cat -vpara 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

O Grep tem problemas para encontrar NULs, pois eles são usados ​​para terminar seqüências de caracteres 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- Shift- @para inserir um byte nulo.

John Kugelman apoia Monica
fonte
3

Se grep -Pnão funcionar (por exemplo, no OS X), tente o seguinte:

grep -E '\x00' ...
robinst
fonte
Tem certeza de que isso funciona? I não com a minha versão: grep (grep GNU) 2,14
guettli
3
Esta resposta é para o BSD grep, tente a resposta principal para o GNU grep:grep -Pa '\x00' ...
robinst
1

No bash, você pode adicionar caracteres especiais quando prefixado com C-qou 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, seguida por control key+ character a, que procura pelo valor ASCII SOH (01). Infelizmente, isso não funciona para o personagem NUL.

Olaf Dietsche
fonte
Presumivelmente, você não quer dizer que essa sequência de caracteres deva ser escrita literalmente, mas inserida no teclado logicamente?
Lightness Races com Monica
Sim, claro. Essa é a tecla de controle pressionada, pressione v, depois mantenha pressionada a tecla Control, pressione a.
Olaf Dietsche
Eu acho que isso não está claro na sua resposta.
Lightness Races com Monica
@LightnessRacesinOrbit Obrigado pela dica. Eu tentei esclarecer na resposta.
Olaf Dietsche
@JohnKugelman Obrigado pela edição. Parece que eu deveria ter examinado a ajuda mais de perto.
Olaf Dietsche
-3

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

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

Alternativamente, você pode tentar convertê-lo em algum tipo de despejo hexadecimal ( od, xxdou algo assim) e grep para a saída dele. Mas, francamente falando, seria complicado acertar.

rodrigo
fonte