วิธี grep สำหรับอักขระพิเศษ NUL (^ @ ^ @ ^ @)


26

ไฟล์:

O000000667520994000000074720121112000000N^@^@^@ 

ฉันใช้คำสั่งด้านล่าง แต่มันไม่ทำงาน

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

คำตอบ:


52

คุณสามารถ grep สำหรับตัวละครใด ๆ รวมถึงตัวควบคุม / ตัวละครที่ไม่สามารถพิมพ์ได้ในโหมด perl-regexp (-P) ด้วยรหัสฐานสิบหก:

grep -Pa '\x00' ...

5
คุณอาจต้องการเพิ่ม-aตัวเลือกมิฉะนั้นgrepคิดว่าเป็นข้อมูลไบนารีและจะไม่แสดงบรรทัดที่ตรงกัน
mpy

ฉันไม่สามารถหาวิธีตรวจสอบว่าไฟล์มีเฉพาะ ASCII = 0 ไบต์ ... grep -Pv '\x00' fileไม่สามารถใช้งานได้ใน Cygwin ...
pbies

@mpy ไม่มี-a(บางครั้ง?) มันไม่แม้แต่จะหารูปแบบ ขอบคุณ! อาจช่วยงานอดิเรก @ ได้เช่นกัน
Michel de Ruiter

13

^@ไม่ใช่กะรัต^และที่เครื่องหมาย@เป็นตัวละครหนึ่งตัว มันเป็นวิธีที่บางโปรแกรมแสดงอักขระ NUL - ค่า ASCII 0 หรือที่เรียกว่า\0ใน C

ที่นี่ฉันได้สร้างไฟล์ที่มี NUL ไบต์อยู่ในนั้น สังเกตว่าฉันใช้cat -vเพื่อแสดงตัวละครที่ไม่ได้พิมพ์

$ 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 มีปัญหาในการค้นหา NUL เนื่องจากพวกมันคุ้นเคยกับการยกเลิกสตริงใน C. Sed แต่สามารถทำงานได้:

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

ใน vi ในโหมดแทรกกดCtrl- V, Ctrl- Shift- @เพื่อแทรกไบต์ว่าง


3

หากgrep -Pไม่ทำงาน (เช่นใน OS X) ให้ลองวิธีนี้:

grep -E '\x00' ...

คุณแน่ใจหรือว่าใช้งานได้ ฉันไม่ได้ใช้เวอร์ชั่นของฉัน: grep (GNU grep) 2.14
guettli

3
คำตอบนี้เป็น BSD grep ลองคำตอบด้านบนสำหรับ GNU grep:grep -Pa '\x00' ...
robinst

1

ในทุบตีคุณสามารถเพิ่มตัวอักษรพิเศษเมื่อนำหน้าด้วยหรือC-q C-vตัวอย่างเช่นคุณสามารถ

grep 'Ctrl-vCtrl-a' file.txt

สตริงการค้นหาควรอ่านเป็นcontrol key+ character vตามด้วยcontrol key+ character aซึ่งค้นหาค่า ASCII SOH (01) น่าเสียดายที่นี่ใช้ไม่ได้กับตัวละคร NUL


สมมุติคุณไม่ได้หมายความว่าลำดับตัวละครควรจะถูกเขียนออกมาอย่างแท้จริง แต่แทนที่จะเขียนลงบนคีย์บอร์ดอย่างมีเหตุผล?
การแข่งขัน Lightness กับโมนิก้า

ใช่แน่นอน นี่คือปุ่มควบคุมค้างไว้กด v แล้วกดปุ่มควบคุมค้างไว้กด a
Olaf Dietsche

ฉันคิดว่ามันไม่ชัดเจนในคำตอบของคุณ
การแข่งขัน Lightness กับโมนิก้า

@LightnessRacesinOrbit ขอบคุณสำหรับคำใบ้ ฉันพยายามชี้แจงในคำตอบ
Olaf Dietsche

@JohnKugelman ขอบคุณสำหรับการแก้ไข ดูเหมือนว่าฉันควรตรวจสอบความช่วยเหลืออย่างใกล้ชิดยิ่งขึ้น
Olaf Dietsche


-3

ตัวละคร ^ @ เป็นตัวละครของ NUL ดังนั้นฉันกลัวว่ามันจะไม่สามารถโลภได้โดยตรง

ตัวเลือกที่ดีที่สุดของคุณน่าจะเขียนโปรแกรมง่าย ๆ ที่ค้นหาลำดับของไบต์

หรือคุณอาจพยายามที่จะแปลงเป็นรูปแบบของการถ่ายโอนข้อมูลเลขฐานสิบหก (บางod, xxdหรือดังนั้น) และ grep เข้าออกของมัน แต่การพูดอย่างตรงไปตรงมามันจะยากที่จะทำให้ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.