Cách grep cho ký tự đặc biệt NUL (^ @ ^ @ ^ @)


26

Tập tin:

O000000667520994000000074720121112000000N^@^@^@ 

Tôi đã sử dụng lệnh dưới đây nhưng nó không hoạt động.

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

Câu trả lời:


52

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

5
Bạn có thể muốn thêm -atùy chọn, nếu không grepnghĩ rằng đó là dữ liệu nhị phân và sẽ không hiển thị các dòng khớp.
mpy

Tôi không thể tìm cách kiểm tra xem tệp chỉ chứa ASCII = 0 byte ... grep -Pv '\x00' filekhông hoạt động trong Cygwin ...
yêu thích

@mpy Nếu không có -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.
Michel de Ruiter

13

^@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à \0trong 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.


3

Nếu grep -Pkhông hoạt động (ví dụ: trên OS X), hãy thử điều này:

grep -E '\x00' ...

Bạn có chắc chắn rằng điều này làm việc? Tôi không dùng phiên bản của mình: grep (GNU grep) 2.14
guettli

3
Câu trả lời này dành cho BSD grep, hãy thử câu trả lời hàng đầu cho GNU grep:grep -Pa '\x00' ...
robinst

1

Trong bash, bạn có thể thêm các ký tự đặc biệt khi có tiền tố C-qhoặ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.


Có lẽ bạn không thực sự có nghĩa là một chuỗi ký tự như vậy nên được viết ra theo nghĩa đen, nhưng thay vào đó được nhập trên bàn phím một cách hợp lý?
Cuộc đua nhẹ nhàng với Monica

Phải, tất nhiên. Đây là phím điều khiển được giữ, nhấn v, sau đó nhấn và giữ phím Control, nhấn a.
Olaf Dietsche

Tôi nghĩ rằng điều đó không rõ ràng trong câu trả lời của bạn.
Cuộc đua nhẹ nhàng với Monica

@LightnessRacesinOrbit Cảm ơn bạn đã gợi ý. Tôi đã cố gắng làm rõ trong câu trả lời.
Olaf Dietsche

@JohnKugelman Cảm ơn bạn đã chỉnh sửa. Có vẻ như tôi nên xem xét sự giúp đỡ kỹ hơn.
Olaf Dietsche


-3

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, xxdhoặ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.