यूनिक्स में विशेष पात्रों के लिए grep


94

मेरे पास एक लॉग फ़ाइल (application.log) है जिसमें कई लाइनों पर सामान्य और विशेष वर्णों के निम्नलिखित स्ट्रिंग हो सकते हैं:

*^%Q&$*&^@$&*!^@$*&^&^*&^&

मैं लाइन नंबर (ओं) को खोजना चाहता हूं जिसमें यह विशेष वर्ण स्ट्रिंग है।

grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

उपरोक्त आदेश कोई परिणाम नहीं देता है।

लाइन नंबर प्राप्त करने के लिए सही सिंटैक्स क्या होगा?


^@: इसका मतलब ^है @या शून्य चरित्र?
नहुएल फौलीउल

जवाबों:


156

बताओ grepका उपयोग कर तय स्ट्रिंग के रूप में अपने इनपुट के इलाज के लिए -Fविकल्प।

grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

-nलाइन नंबर प्राप्त करने के लिए विकल्प की आवश्यकता होती है,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

7
ग्रेप आप केवल बचने के लिए (एक बैकस्लैश के साथ) की जरूरत के अपने संस्करण के आधार पर ^, $, ., *और \ । या आप भी कोशिश कर सकते fgrepहैं।
नहुएल फौलीउल

2
@ नाहुएलफौइलुल: +1। btw, के fgrepरूप में ही है grep -F
प्रिंस जॉन वेस्ले

@PrinceJohnWesley: यह समान है लेकिन कुछ सिस्टम पर grep के कई संस्करण हैं इसलिए fgrep का उपयोग करने से वह संस्करण मिल सकता है जो समर्थन -F
Nahuel Fouilleul

अगर वह इस्तेमाल करे तो क्या होगा egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
inckka

काम नहीं करता है। grep -rinF '-static'प्रिंट करता है Invalid option «t»। @ मणि के जवाब में काम किया , अर्थात grep -rin "\-static"
हाय-एंजेल

92

जो मेरे लिए काम करता है वह है:

grep -e '->'

-E का मतलब है कि अगला तर्क पैटर्न है, और एक तर्क के रूप में व्याख्या नहीं की जाएगी।

से: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/


str = '! "# $% & () * +, -। /: <=>? @ [@ \ _ ^ _` `}}} ~;" गूंज "$ str" | grep -e "$ str" ..... काम नहीं कर रहा है, आपके लिए जो काम किया था उसमें स्विच साइन के अलावा पर्याप्त विशेष वर्ण नहीं थे '-', लेकिन -ई के बजाय -F काम कर रहा है!
THESorcerer

1
केवल एक चीज मेरे लिए काम करती है, यहां तक ​​कि '\' या -F या fgrep काम नहीं करता है। धन्यवाद!
user180574

2
यह स्वीकृत उत्तर होना चाहिए - सरल और grep के लिए काम करता है
Ishay Peled

1
एक स्ट्रिंग खोजते समय '-' 'char' को शामिल करने की कोशिश की -F और fgrep मेरे लिए काम नहीं करता है। यह काम।
世界

मैं सोच रहा हूं कि यह प्रश्न इस प्रश्न में क्यों मौजूद है ( stackoverflow.com/q/12387685 क्यू एंड ए के संदर्भ में मैं अभी देख रहा हूं) - शायद उत्तर का एक गलत मामला दूसरे प्रश्न से विलीन हो रहा है? से शुरू होने वाले पैटर्न की खोज करने के लिए -, stackoverflow.com/questions/2427913/…
सुंदरदीप

6

एक संबंधित नोट

कैरेज रिटर्न के लिए grep, अर्थात् \rचरित्र, या 0x0d, हम यह कर सकते हैं:

grep -F $'\r' application.log

POSIX अनुकूलता के लिए वैकल्पिक रूप से, का उपयोग करें printf, याecho

grep -F "$(printf '\r')" application.log

और हम उपयोग कर सकते हैं hexdump, या lessकरने के लिए देखने के परिणाम:

$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000   a  \r   b  \n

$'\r'और अन्य समर्थित वर्णों के उपयोग के बारे में , बैश मैनुअल> ANSI-C कोटिंग देखें :

फॉर्म $ 'स्ट्रिंग' के शब्द विशेष रूप से व्यवहार किए जाते हैं। यह शब्द ANSI C मानक द्वारा निर्दिष्ट बैकस्लैश-एस्कैप्ड वर्णों के साथ स्ट्रिंग में फैलता है


3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&

2

आप किसी भी अल्फ़ान्यूमेरिक वर्ण और स्थान को हटाने का प्रयास कर सकते हैं। और फिर उपयोग -nआपको लाइन नंबर देगा। निम्नलिखित का प्रयास करें:

grep -vn "^[a-zA-Z0-9 ]*$" application.log


धन्यवाद .. यह मेरे लिए एक फ़ाइल से विशेष वर्ण खोजने के लिए अच्छा काम करता है।
दीपंकर नलुई

-4

-B विकल्प के साथ vi का प्रयास करें, यह लाइन वर्णों के विशेष छोर को दिखाएगा (मैं आमतौर पर इसका उपयोग यूनिक्स ओएस पर एक txt फ़ाइल में विंडो लाइन के अंत को देखने के लिए करता हूं)

लेकिन अगर आप एक स्क्रिप्टेड समाधान चाहते हैं तो स्पष्ट रूप से vi अभ्यस्त काम करते हैं, इसलिए आप grep के साथ -f या -e विकल्पों को आज़मा सकते हैं और परिणाम को sed या awk में पाइप कर सकते हैं। Grep मैन पेज से:

मिलान चयन -E, --extended-regexp एक विस्तृत नियमित अभिव्यक्ति (ERE, नीचे देखें) के रूप में पैटर्न की व्याख्या करें। (-E POSIX द्वारा निर्दिष्ट है।)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  (-F is specified
          by POSIX.)

2
किस तरह से यह एक स्वीकृत उत्तर से बेहतर है, इसलिए आपने इसे लगभग 5 साल पुराने प्रश्न में जोड़ा है?
सर्गगर्ल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.