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


26

Plik:

O000000667520994000000074720121112000000N^@^@^@ 

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

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

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' ...

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.


3

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

grep -E '\x00' ...

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.


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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.