Tập tin:
O000000667520994000000074720121112000000N^@^@^@
Tôi đã sử dụng lệnh dưới đây nhưng nó không hoạt động.
grep "^@^@^@" *
Tập tin:
O000000667520994000000074720121112000000N^@^@^@
Tôi đã sử dụng lệnh dưới đây nhưng nó không hoạt động.
grep "^@^@^@" *
Câu trả lời:
Bạn có thể grep cho bất kỳ ký tự nào, bao gồm các ký tự điều khiển / không in được trong chế độ perl-regapi (-P) bằng mã hex của nó:
grep -Pa '\x00' ...
grep -Pv '\x00' file
không hoạt động trong Cygwin ...
-a
(đôi khi?), nó thậm chí không tìm thấy mô hình. Cảm ơn! Cũng có thể giúp @p sở thích.
^@
không phải là một carat ^
và dấu hiệu @
, đó là một nhân vật. Đó là cách một số chương trình hiển thị ký tự NUL Giá trị ASCII 0, còn được gọi là \0
trong C.
Ở đây tôi đã tạo một tệp có byte NUL trong đó. † Thông báo mà tôi sử dụng cat -v
để hiển thị các ký tự không in.
$ 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 gặp khó khăn khi tìm NUL vì chúng được sử dụng để chấm dứt chuỗi trong C. Sed, tuy nhiên, có thể thực hiện công việc:
$ sed -n '/\x0/p' blah
null
$ sed -n '/\x0/p' blah | cat -v
null^@
† Trong vi, trong chế độ insert báo chí Ctrl- V, Ctrl- Shift- @để chèn một byte null.
Trong bash, bạn có thể thêm các ký tự đặc biệt khi có tiền tố C-q
hoặc C-v
. Vì vậy, bạn có thể, ví dụ
grep 'Ctrl-vCtrl-a' file.txt
Chuỗi tìm kiếm phải được đọc là control key
+ character v
, theo sau là control key
+ character a
, tìm kiếm giá trị ASCII SOH (01). Thật không may, điều này không làm việc cho nhân vật NUL.
^ @ là nhân vật NUL. Bạn muốn làm gì với các dòng tệp của bạn có chứa nó?
Bạn có thể xem /programming/2398393/identifying-and-removing-null-char character-in-unix có liên quan đến một vấn đề tương tự.
Nhân vật ^ @ là char NUL, vì vậy tôi sợ rằng nó không thể được ghép trực tiếp.
Tùy chọn tốt nhất của bạn có lẽ là viết một chương trình đơn giản tìm kiếm chuỗi byte này.
Hoặc bạn có thể thử để chuyển đổi nó vào một số hình thức bãi thập lục phân ( od
, xxd
hoặc lâu hơn) và grep vào đầu ra của nó. Nhưng thẳng thắn mà nói, sẽ rất khó để làm cho đúng.
-a
tùy chọn, nếu khônggrep
nghĩ rằng đó là dữ liệu nhị phân và sẽ không hiển thị các dòng khớp.