Jak grep dla znaku specjalnego NUL (^ @ ^ @ ^ @)

26

Plik:

O000000667520994000000074720121112000000N^@^@^@ 

Użyłem poniższego polecenia, ale to nie działa.

grep "^@^@^@" *

źródło

Odpowiedzi:

52

Możesz grep dla dowolnych znaków, w tym znaków sterujących / niedrukowalnych w trybie perl-regexp (-P) za pomocą kodu szesnastkowego:

grep -Pa '\x00' ...
Gość
źródło
5
Możesz dodać -aopcję, w przeciwnym razie grepuważasz, że są to dane binarne i nie będą wyświetlać pasujących wierszy.
mpy
Nie mogę znaleźć sposobu, aby sprawdzić, czy plik zawiera tylko ASCII = 0 bajtów ... grep -Pv '\x00' filenie działa w Cygwin ...
pbies 16.08.18
@ mpy Bez -a(czasem?) nawet nie znajduje wzorca. Dzięki! Może pomóc również @pbies.
Michel de Ruiter,
13

^@nie jest karatem ^i znakiem @, to jedna postać. W ten sposób niektóre programy wyświetlają znak NUL - wartość 0 ASCII, znana również jako \0C.

Tutaj utworzyłem plik z bajtem NUL. Zauważ, że używam cat -vdo wyświetlania znaków niedrukowalnych.

$ 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 ma problem ze znalezieniem wartości NUL, ponieważ są one używane do zakończenia ciągów znaków w C. Sed, jednak może wykonać to zadanie:

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

W trybie vi, w trybie wstawiania naciśnij Ctrl- V, Ctrl- Shift-, @aby wstawić bajt zerowy.

John Kugelman wspiera Monikę
źródło
3

Jeśli grep -Pnie działa (np. W systemie OS X), spróbuj tego:

grep -E '\x00' ...
robinst
źródło
Czy jesteś pewien, że to działa? Nie mam tej wersji: grep (GNU grep) 2.14
guettli
3
Ta odpowiedź jest dla grep BSD, spróbuj najwyższą odpowiedź dla GNU grep:grep -Pa '\x00' ...
robinst
1

W bash możesz dodawać znaki specjalne, gdy są poprzedzone znakiem C-qlub C-v. Możesz na przykład

grep 'Ctrl-vCtrl-a' file.txt

Wyszukiwany ciąg należy odczytać jako control key+ character v, a po nim control key+ character a, który wyszukuje wartość ASCII SOH (01). Niestety nie działa to dla postaci NUL.

Olaf Dietsche
źródło
Prawdopodobnie nie masz na myśli, że taka sekwencja znaków powinna być napisana dosłownie, ale logicznie wpisana na klawiaturze?
Lekkość ściga się z Monicą
Tak oczywiście. To jest wciśnięty klawisz Control, naciśnij v, a następnie przytrzymaj klawisz Control, naciśnij a.
Olaf Dietsche
Myślę, że to nie jest jasne w twojej odpowiedzi.
Wyścigi lekkości z Moniką
@LightnessRacesinOrbit Dzięki za podpowiedź. Próbowałem wyjaśnić w odpowiedzi.
Olaf Dietsche
@JohnKugelman Dzięki za edycję. Wydaje się, że powinienem był przyjrzeć się bliżej pomocy.
Olaf Dietsche
-3

Znak ^ @ jest znakiem NUL, więc obawiam się, że nie można go bezpośrednio grepować.

Najlepszą opcją byłoby prawdopodobnie napisanie prostego programu, który szuka tej sekwencji bajtów.

Alternatywnie można spróbować przekształcić go w jakiejś formie zrzutu szesnastkowego ( od, xxdlub tak) i grep do wyjścia z niego. Ale szczerze mówiąc, trudno byłoby to naprawić.

rodrigo
źródło