विशेष चरित्र NUL के लिए कैसे grep (^ @ ^ @ ^ @ @)


26

फ़ाइल:

O000000667520994000000074720121112000000N^@^@^@ 

मैंने नीचे कमांड का उपयोग किया है लेकिन यह काम नहीं करता है।

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

जवाबों:


52

आप किसी भी वर्ण के लिए नियंत्रण सहित / गैर-मुद्रण योग्य वर्णों को perl-regexp मोड (-पी) में उसके xx कोड द्वारा देख सकते हैं:

grep -Pa '\x00' ...

5
आप -aविकल्प जोड़ना चाह सकते हैं , अन्यथा grepसोचता है कि यह बाइनरी डेटा है और मिलान लाइनों को प्रदर्शित नहीं करेगा।
खसखस

मुझे यह जांचने का कोई तरीका नहीं मिल रहा है कि क्या फ़ाइल में केवल ASCII = 0 बाइट्स हैं ... grep -Pv '\x00' file
साइगविन

इसके बिना -a(कभी-कभी?) पैटर्न भी नहीं मिलता है। धन्यवाद! साथ ही @pbies की मदद कर सकते हैं।
मिशेल डी रुएटर

13

^@एक कैरेट ^और एट-साइन नहीं है @, यह एक चरित्र है। यह है कि कुछ प्रोग्राम NUL चरित्र- ASCII मान 0 को कैसे प्रदर्शित करते हैं, इसे \0C के रूप में भी जाना जाता है।

यहाँ मैंने एक NUL बाइट के साथ एक फाइल बनाई है। Use ध्यान दें कि मैं 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

सी। सैप में स्ट्रिंग्स को समाप्त करने के लिए उपयोग किए जाने के बाद से ग्रेप को एनयूएल को खोजने में परेशानी होती है, हालांकि, यह काम कर सकता है:

$ 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' ...
रॉबिन

1

बैश में आप विशेष वर्ण जोड़ सकते हैं जब C-qया के साथ उपसर्ग किया जाता है C-v। तो आप कर सकते हैं, उदाहरण के लिए

grep 'Ctrl-vCtrl-a' file.txt

खोज स्ट्रिंग के रूप में पढ़ा जाना चाहिए control key+ character v, द्वारा पीछा control key+ character a, जो ASCII मूल्य एसओएच (01) के लिए खोज करता है। दुर्भाग्य से यह एनयूएल चरित्र के लिए काम नहीं करता है।


संभवतः आप वास्तव में इसका मतलब यह नहीं है कि इस तरह के एक चरित्र अनुक्रम को शाब्दिक रूप से लिखा जाना चाहिए, लेकिन इसके बजाय कीबोर्ड पर तार्किक रूप से दर्ज किया गया है?
मोनिका

हां बिल्कुल। यह नियंत्रण कुंजी है जिसे दबाया गया है, v दबाएं, फिर नियंत्रण कुंजी दबाए रखें, a दबाएं।
ओलाफ डाइटेचेस

मुझे लगता है कि यह आपके उत्तर में अस्पष्ट है।
मोनिका

@LightnessRacesinOrbit संकेत के लिए धन्यवाद। मैंने जवाब में स्पष्ट करने की कोशिश की।
ओलाफ डाइटेचेस

@JohnKugelman संपादन के लिए धन्यवाद। लगता है कि मुझे और अधिक बारीकी से मदद में देखना चाहिए था।
ओलाफ डाइटेचेस


-3

चरित्र ^ @ एनयूएल चार है, इसलिए मुझे डर है कि इसे सीधे नहीं पकड़ा जा सकता है।

आपका सबसे अच्छा विकल्प शायद एक साधारण प्रोग्राम लिखना होगा जो बाइट्स के इस क्रम को खोजता है।

वैकल्पिक रूप से आप इसे हेक्साडेसिमल डंप (और od, xxdया तो) के कुछ रूप में बदलने की कोशिश कर सकते हैं और इसके आउटपुट में grep कर सकते हैं। लेकिन स्पष्ट रूप से, यह सही पाने के लिए मुश्किल होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.