मैं grep
एक स्ट्रिंग के लिए चाहूंगा , लेकिन पूर्ववर्ती पांच पंक्तियों और निम्नलिखित पांच पंक्तियों के साथ-साथ मिलान की गई रेखा को भी दिखाऊंगा। मैं यह कैसे कर पाऊंगा?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
मैं grep
एक स्ट्रिंग के लिए चाहूंगा , लेकिन पूर्ववर्ती पांच पंक्तियों और निम्नलिखित पांच पंक्तियों के साथ-साथ मिलान की गई रेखा को भी दिखाऊंगा। मैं यह कैसे कर पाऊंगा?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
जवाबों:
के लिए बीएसडी या जीएनयू grep
आप उपयोग कर सकते हैं -B num
मैच से पहले और कितने लाइनों सेट करने के लिए -A num
मैच के बाद लाइनों की संख्या के लिए।
grep -B 3 -A 2 foo README.txt
यदि आप उपयोग करने से पहले और बाद में समान पंक्तियाँ चाहते हैं -C num
।
grep -C 3 foo README.txt
यह 3 लाइनों को पहले और 3 लाइनों को बाद में दिखाएगा।
-A
और -B
काम करेंगे, इच्छा के रूप में -C n
(के लिए n
, या बस संदर्भ की तर्ज) -n
(के लिए n
संदर्भ की तर्ज ... जब तक कि एन 1 से 9 तक है)।
-n
प्रारूप की कोशिश की और पता चला कि यह केवल तब तक काम करता है 9
। इसके लिए 15
5 पंक्तियाँ
-A
, -B
या -C
) है। आमतौर पर, विकल्प निर्दिष्टकर्ता का मान ( -o a.out
GCC में आउटपुट फ़ाइल निर्दिष्ट करने के लिए) होता है, लेकिन यह एक साधारण स्विच / ध्वज के रूप में भी कार्य कर सकता है ( -g
GCC में डिबगिंग जानकारी सक्षम करने के लिए)। हालांकि विकल्पों के बीच रिक्त स्थान, वैकल्पिक हैं तो एक मूल्य के बिना विकल्पों के लिए, यह उन्हें एक करना (संभव है -ABC
) है, जो मतलब है कि -15
व्याख्या की है -1 -5
(दो अलग विकल्प) और -5
ओवरराइड -1
।
are grep के समान तर्कों के साथ काम करता है, और स्वीकार करता है -C
। लेकिन आमतौर पर कोड के माध्यम से खोज करना बेहतर होता है।
grep
"विज्ञापन" के लिए इसका उपयोग करने के बारे में निश्चित नहीं है ack
(जो कि एक महान उपकरण है, वास्तव में) एक अच्छा विचार है ...
grep astring myfile -A 5 -B 5
यह "एस्ट्रिंग" के लिए "मायफाइल" को grep करेगा, और प्रत्येक मैच से पहले और बाद में 5 लाइनें दिखाएगा
मैं सामान्य रूप से उपयोग करता हूं
grep searchstring file -C n # n for number of lines of context up and down
Grep जैसे कई टूल में वास्तव में बहुत बढ़िया मैन फाइल्स भी हैं। मैं खुद को grep के मैन पेज का जिक्र करता हूं क्योंकि इसमें बहुत कुछ है जो आप इसके साथ कर सकते हैं।
man grep
कई जीएनयू टूल में एक सूचना पृष्ठ भी होता है जिसमें मैन पेज के अलावा अधिक उपयोगी जानकारी हो सकती है।
info grep
Grep का उपयोग करें
$ grep --help | grep -i context
Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context
-C, --context=NUM print NUM lines of output context
-NUM same as --context=NUM
"17655" के लिए "/some/file.txt" में 10 लाइनों का संदर्भ दिखाते हुए पहले और बाद में (Awk का उपयोग करते हुए), आउटपुट एक कॉलोनी के बाद लाइन नंबर के साथ पहले हुआ। सोलारिस पर इसका उपयोग तब करें जब 'grep' "- [ACB]" विकल्पों का समर्थन नहीं करता है।
awk '
/17655/ {
for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
print before[i]
}
print (NR ":" ($0))
a = 10
}
a-- > 0 {
print (NR ":" ($0))
}
{
before[b] = (NR ":" ($0))
b = (b + 1) % 10
}' /some/file.txt;
ripgrep
यदि आप प्रदर्शन के बारे में परवाह करते हैं, तो ripgrep
उसी तरह के सिंटैक्स का उपयोग करें grep
, जैसे
rg -C5 "pattern" .
-C
,--context NUM
- दिखाएँ NUM पंक्तियाँ से पहले और प्रत्येक मैच के बाद।
ऐसे -A
/ --after-context
और -B
/ जैसे पैरामीटर भी हैं --before-context
।
टूल रुस्ट के रेगेक्स इंजन के ऊपर बनाया गया है जो इसे बड़े डेटा पर बहुत कुशल बनाता है ।
यहाँ @Ygor समाधान हैawk
awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile
नोट: पहले और बाद में लाइनों की संख्या के साथ बदलें a
और b
चर।
यह विशेष रूप से सिस्टम के लिए उपयोगी है जो grep -A
, -B
और -C
मापदंडों का समर्थन नहीं करता है ।
यदि आप अक्सर कोड खोजते हैं, तो जीआरई की तुलना में एजी सिल्वर खोजकर्ता अधिक कुशल (यानी तेज) है।
आप -C विकल्प का उपयोग करके संदर्भ लाइनें दिखाते हैं।
उदाहरण के लिए:
ag -C 3 "foo" myFile
line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7