How to grep for special character NUL (^@^@^@)

26

6

File:

O000000667520994000000074720121112000000N^@^@^@ 

I used the below command but it doesn't work.

grep "^@^@^@" *

user1580770

Posted 2012-11-17T21:50:57.427

Reputation:

Answers

53

You can grep for any characters including control/non-printable characters in perl-regexp mode (-P) by its hex code:

grep -Pa '\x00' ...

Guest

Posted 2012-11-17T21:50:57.427

Reputation: 631

I can't find a way to check if file contains only ASCII=0 bytes... grep -Pv '\x00' file does not work in Cygwin... – pbies – 2018-08-16T12:51:59.550

@mpy Without -a (sometimes?) it doesn't even find the pattern. Thanks! Might help @pbies as well. – Michel de Ruiter – 2019-11-21T08:10:44.497

5You might want to add -a option, otherwise grep thinks it is binary data and won't display the matching lines. – mpy – 2013-06-26T15:19:40.487

13

^@ is not a carat ^ and at-sign @, it's one character. It's how some programs display the NUL character—ASCII value 0, also known as \0 in C.

Here I've created a file with a NUL byte in it. Notice that I use cat -v to show non-printing characters.

$ 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 has trouble finding NULs since they're used to terminate strings in C. Sed, however, can do the job:

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

In vi, in insert mode press Ctrl-V, Ctrl-Shift-@ to insert a null byte.

John Kugelman

Posted 2012-11-17T21:50:57.427

Reputation: 1 620

3

If grep -P doesn't work (e.g. on OS X), try this:

grep -E '\x00' ...

robinst

Posted 2012-11-17T21:50:57.427

Reputation: 131

Are you sure that this works? I does not with my version: grep (GNU grep) 2.14 – guettli – 2017-11-20T07:19:18.393

3This answer is for BSD grep, try the top answer for GNU grep: grep -Pa '\x00' ... – robinst – 2017-11-22T03:18:55.470

1

In bash you can add special characters when prefixed with C-q or C-v. So you can, for example

grep 'Ctrl-vCtrl-a' file.txt

The search string should be read as control key + character v, followed by control key + character a, which searches for ASCII value SOH (01). Unfortunately this doesn't work for the NUL character.

Olaf Dietsche

Posted 2012-11-17T21:50:57.427

Reputation: 421

Presumably you don't actually mean that such a character sequence should be written out literally, but instead entered on the keyboard logically? – Lightness Races with Monica – 2012-11-17T22:10:27.573

Yes, of course. This is control key held down, press v, then hold down Control key, press a. – Olaf Dietsche – 2012-11-17T22:12:41.227

I think that's unclear in your answer. – Lightness Races with Monica – 2012-11-17T22:13:09.190

@LightnessRacesinOrbit Thanks for the hint. I tried to clarify in the answer. – Olaf Dietsche – 2012-11-17T22:15:44.637

@JohnKugelman Thanks for the edit. Seems I should have looked into the help more closely. – Olaf Dietsche – 2012-11-17T22:18:11.213

@John: Nice one! – Lightness Races with Monica – 2012-11-17T22:22:32.843

-3

Character ^@ is the NUL char, so I'm afraid that it cannot be grepped directly.

Your best option would be probably to write a simple program that searches for this sequence of bytes.

Alternatively you may try to convert it into some form of hexadecimal dump (od, xxd or so) and grep into the output of it. But frankly speaking, it would be tricky to get it right.

rodrigo

Posted 2012-11-17T21:50:57.427

Reputation: 150