Como eu faço para esse “^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @ ^ @” de um arquivo?

0

Quando tento aplicar a expressão abaixo.

$ grep -A2 "IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready" log.txt

Eu obtenho o resultado como -

date-time kern servname: []: info [   83.262033] IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@date-time syslog servname syslog-ng[10831]: notice syslog-ng starting up; version='3.2.5'
date-time kern servname: []: info [    0.000000] Initializing cgroup subsys cpuset

Agora, o @@@@ representa uma falha no sistema, creio eu, como posso grep para apenas '@ ^ @'.

Eu tentei grep @^ file.txt , grep '@^' file.txt , grep '@.*@.*@' file.txt e algumas outras expressões sem sorte.

    
por Vignesh SP 03.01.2018 / 05:14

2 respostas

4

Quando o sistema é reinicializado sem que os arquivos sejam liberados pela primeira vez, é possível que um arquivo que está sendo gravado tenha o novo tamanho, mas os dados ainda não tenham sido gravados no disco.

Nesse caso, o buraco no arquivo conterá caracteres NUL. (Também é possível criar deliberadamente arquivos com falhas neles sem reiniciar, mas não acho que isso seja aplicável ao seu cenário.)

Algumas ferramentas exibirão caracteres NUL como ^@ , que é um espaço reservado para um único caractere não imprimível e é totalmente diferente de um ^ seguido por um @ , motivo pelo qual seu comando grep não funcionará .

Com essa informação, consegui encontrar uma resposta em um site irmão. A solução sugerida é usar os seguintes argumentos para o grep:

grep -Pa '\x00'

Eu testei que isso funciona para mim. Observe que usar -P ou -a sozinho não funciona, você precisa dos dois antes que \x00 funcione.

    
por 03.01.2018 / 23:37
0

Se você só procurar por linhas com "@ ^ @" você pode usar grep "\@\^\@" file.txt (você tem que escapar dos caracteres especiais).

    
por 03.01.2018 / 09:25