Come richiedere un carattere speciale NUL (^ @ ^ @ ^ @)


26

File:

O000000667520994000000074720121112000000N^@^@^@ 

Ho usato il comando seguente ma non funziona.

grep "^@^@^@" *
linux  unix 

Risposte:


52

Puoi grep per qualsiasi personaggio incluso controllo / caratteri non stampabili in modalità perl-regexp (-P) con il suo codice esadecimale:

grep -Pa '\x00' ...

5
Potresti voler aggiungere -a un'opzione, altrimenti greppensa che siano dati binari e non visualizzerà le linee corrispondenti.
mpy,

Non riesco a trovare un modo per verificare se il file contiene solo ASCII = 0 byte ... grep -Pv '\x00' file non funziona in Cygwin ...
pbies

@mpy Senza -a(a volte?) non trova nemmeno lo schema. Grazie! Potrebbe aiutare anche @pbies.
Michel de Ruiter,

13

^@non è un carato ^e un segno @, è un personaggio. È come alcuni programmi visualizzano il carattere NUL — valore ASCII 0, noto anche come \0in C.

Qui ho creato un file con un byte NUL in esso. Si noti che utilizzo cat -vper mostrare caratteri non stampabili.

$ 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 ha difficoltà a trovare NUL poiché sono usati per terminare le stringhe in C. Sed, tuttavia, possono fare il lavoro:

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

In vi, nella modalità di inserimento premere Ctrl- V, Ctrl- Shift- @per inserire un byte nullo.


3

Se grep -Pnon funziona (ad es. Su OS X), prova questo:

grep -E '\x00' ...

Sei sicuro che funzioni? Non lo faccio con la mia versione: grep (GNU grep) 2.14
guettli

3
Questa risposta è per BSD grep, prova la risposta migliore per GNU grep:grep -Pa '\x00' ...
robinst

1

In bash puoi aggiungere caratteri speciali quando sono prefissati con C-qoC-v . Quindi puoi, per esempio

grep 'Ctrl-vCtrl-a' file.txt

La stringa di ricerca deve essere letta come control key+ character v, seguita da control key+ character a, che cerca il valore ASCII SOH (01). Sfortunatamente questo non funziona per il personaggio NUL.


Presumibilmente non intendi davvero che una tale sequenza di caratteri debba essere scritta letteralmente, ma invece immessa sulla tastiera logicamente?
Corse di leggerezza con Monica il

Sì, naturalmente. Questo è il tasto di controllo premuto, premere v, quindi tenere premuto il tasto di controllo, premere a.
Olaf Dietsche,

Penso che non sia chiaro nella tua risposta.
Corse di leggerezza con Monica il

@LightnessRacesinOrbit Grazie per il suggerimento. Ho cercato di chiarire la risposta.
Olaf Dietsche,

@JohnKugelman Grazie per la modifica. Sembra che avrei dovuto esaminare più da vicino l'aiuto.
Olaf Dietsche,


-3

Il personaggio ^ @ è il carattere NUL, quindi temo che non possa essere diretto direttamente.

La tua migliore opzione sarebbe probabilmente quella di scrivere un semplice programma che cerchi questa sequenza di byte.

In alternativa si può tentare di convertirlo in una qualche forma di dump esadecimale ( od, xxdo giù di lì) e grep nell'uscita di esso. Ma francamente, sarebbe difficile farlo bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.