Plik:
O000000667520994000000074720121112000000N^@^@^@
Użyłem poniższego polecenia, ale to nie działa.
grep "^@^@^@" *
Plik:
O000000667520994000000074720121112000000N^@^@^@
Użyłem poniższego polecenia, ale to nie działa.
grep "^@^@^@" *
Odpowiedzi:
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' ...
grep -Pv '\x00' file
nie działa w Cygwin ...
-a
(czasem?) nawet nie znajduje wzorca. Dzięki! Może pomóc również @pbies.
^@
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 \0
C.
Tutaj utworzyłem plik z bajtem NUL. † Zauważ, że używam cat -v
do 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.
W bash możesz dodawać znaki specjalne, gdy są poprzedzone znakiem C-q
lub 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.
^ @ jest znakiem NUL. Co chcesz zrobić z wierszami plików, które go zawierają?
Możesz zajrzeć na /programming/2398393/identifying-and-removing-null-characters-in-unix, który dotyczy podobnego problemu.
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
, xxd
lub tak) i grep do wyjścia z niego. Ale szczerze mówiąc, trudno byłoby to naprawić.
-a
opcję, w przeciwnym raziegrep
uważasz, że są to dane binarne i nie będą wyświetlać pasujących wierszy.