ฉันต้องการ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"
;)
คำตอบ:
สำหรับBSDหรือGNU 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
บรรทัดบริบท ... ตราบเท่าที่ n คือ 1 ถึง 9)
-n
ฟอร์แมตแล้วพบว่าใช้งานได้จนถึง9
เท่านั้น เพราะ15
มันส่งคืน 5 บรรทัด
-A
, -B
หรือ-C
) โดยทั่วไปตัวเลือกตัวเลือกจะตามด้วยค่า ( -o a.out
เพื่อระบุไฟล์เอาต์พุตใน GCC) แต่ก็สามารถทำหน้าที่เป็นสวิตช์ / แฟล็กแบบง่าย ( -g
เพื่อเปิดใช้งานข้อมูลการดีบักใน GCC) แต่ช่องว่างระหว่างตัวเลือกเป็นตัวเลือกเพื่อให้ตัวเลือกโดยไม่ต้องมีค่าก็เป็นไปได้ที่จะผสานพวกเขา ( -ABC
) ซึ่งหมายความว่า-15
จะถูกตีความ-1 -5
(สองตัวเลือกที่แยกต่างหาก) และแทนที่-5
-1
แอ๊กชั่นการทำงานที่มีการขัดแย้งที่คล้ายกันเป็น grep -C
และยอมรับ แต่โดยปกติแล้วจะดีกว่าสำหรับการค้นหาด้วยรหัส
grep
ไม่แน่ใจว่าใช้เพื่อ "โฆษณา" ack
(ซึ่งเป็นเครื่องมือที่ดีจริง ๆ ) เป็นความคิดที่ดี ...
grep astring myfile -A 5 -B 5
ที่จะ grep "myfile" สำหรับ "astring" และแสดง 5 บรรทัดก่อนและหลังการแข่งขันแต่ละครั้ง
ปกติฉันจะใช้
grep searchstring file -C n # n for number of lines of context up and down
เครื่องมือหลายอย่างเช่น grep ก็มีไฟล์คนที่ยอดเยี่ยมเช่นกัน ฉันพบว่าตัวเองอ้างถึงหน้าเพจ grepมากเพราะมีหลายสิ่งที่คุณสามารถทำได้
man grep
เครื่องมือ GNU จำนวนมากยังมีหน้าข้อมูลที่อาจมีข้อมูลที่เป็นประโยชน์เพิ่มเติมนอกเหนือจากหน้า man
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) เอาต์พุตที่นำหน้าด้วยหมายเลขบรรทัดตามด้วยเครื่องหมายโคลอน ใช้สิ่งนี้บน Solaris เมื่อ '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
เครื่องมือนี้สร้างขึ้นจากเครื่องมือ regex ของ Rustซึ่งทำให้มีประสิทธิภาพมากกับข้อมูลขนาดใหญ่
นี่คือโซลูชัน @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
พารามิเตอร์
$ grep thestring thefile -5
-5
ทำให้คุณได้รับ5
สายบนและด้านล่างจับคู่ 'theString' เทียบเท่ากับหรือ-C 5
-A 5 -B 5
Grep มีตัวเลือกที่เรียกว่าContext Line Control
คุณสามารถใช้สิ่ง--context
นั้นได้ง่ายๆ
| grep -C 5
หรือ
| grep -5
ควรทำเคล็ดลับ
ฉันใช้เพื่อทำวิธีกะทัดรัด
grep -5 string file
นั่นคือเทียบเท่า
grep -A 5 -B 5 string file
หากคุณค้นหารหัสบ่อยAG ผู้ค้นหาเงินจะมีประสิทธิภาพมากกว่า (เช่นเร็วกว่า) grep
คุณแสดงบรรทัดบริบทโดยใช้ตัวเลือก -C
เช่น:
ag -C 3 "foo" myFile
line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7