26
6
File:
O000000667520994000000074720121112000000N^@^@^@
I used the below command but it doesn't work.
grep "^@^@^@" *
26
6
File:
O000000667520994000000074720121112000000N^@^@^@
I used the below command but it doesn't work.
grep "^@^@^@" *
53
You can grep for any characters including control/non-printable characters in perl-regexp mode (-P) by its hex code:
grep -Pa '\x00' ...
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.
3
If grep -P
doesn't work (e.g. on OS X), try this:
grep -E '\x00' ...
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.
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.
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.4975You might want to add
-a
option, otherwisegrep
thinks it is binary data and won't display the matching lines. – mpy – 2013-06-26T15:19:40.487