ฉันจะดึงข้อมูลบรรทัดก่อน / หลังผลลัพธ์ grep เป็น bash ได้อย่างไร


151

สวัสดีฉันยังใหม่กับการเขียนโปรแกรมทุบตี ฉันต้องการวิธีการค้นหาในข้อความที่กำหนด เพื่อที่ฉันใช้grepฟังก์ชั่น:

grep -i "my_regex"

ที่ได้ผล แต่ให้สิ่งdataนี้:

This is the test data
This is the error data as follows
. . . 
. . . .
. . . . . . 
. . . . . . . . .
Error data ends

เมื่อฉันพบคำerror(ใช้grep -i error data) ฉันต้องการค้นหา 10 บรรทัดที่ตามหลังคำerrorนั้น ดังนั้นผลลัพธ์ของฉันควรเป็น:

    . . . 
    . . . .
    . . . . . . 
    . . . . . . . . .
    Error data ends

มีวิธีใดบ้างที่จะทำ?


ดูเหมือนว่าคุณต้องการให้ทั้ง 10 บรรทัดดำเนินการคำerrorต่อไป
ThomasW

คำตอบ:


266

คุณสามารถใช้-Bและ-Aเพื่อพิมพ์บรรทัดก่อนและหลังการแข่งขัน

grep -i -B 10 'error' data

จะพิมพ์ 10 บรรทัดก่อนการแข่งขันรวมถึงการจับคู่สายตัวเอง


1
ขอบคุณที่ใช้งานได้ แต่เมื่อฉันพยายามเก็บการประมวลผลนี้ในตัวแปรเช่นนี้test=$(grep -i -B 10 'error' data)และพิมพ์โดยใช้echo $testฉันได้เส้นตรงยาวเป็นผลลัพธ์
sriram

1
ขอบคุณฉันคิดออกฉันต้องทำเช่นนี้echo "$test"มากกว่าecho $test
sriram

25
-C 10จะพิมพ์ออกมา 10 บรรทัดทั้งก่อนและหลังในคราวเดียว!
Joshua Pinter

มีวิธีในการทำเช่นนี้โดยใช้เฉพาะก่อนจุดหรือไม่ บอกว่าความยาวที่ฉันต้องคว้ามาก่อนนั้นแปรผันหรือไม่?
Erudaki

31

สิ่งนี้พิมพ์บริบทต่อท้าย 10 บรรทัดหลังจากจับคู่บรรทัด

grep -i "my_regex" -A 10

หากคุณต้องการพิมพ์บริบท 10 บรรทัดก่อนที่จะจับคู่บรรทัด

grep -i "my_regex" -B 10

และถ้าคุณต้องการพิมพ์ 10 บรรทัดของบริบทเอาต์พุตชั้นนำและต่อท้าย

grep -i "my_regex" -C 10

ตัวอย่าง

user@box:~$ cat out 
line 1
line 2
line 3
line 4
line 5 my_regex
line 6
line 7
line 8
line 9
user@box:~$

grep ปกติ

user@box:~$ grep my_regex out 
line 5 my_regex
user@box:~$ 

Grep สายที่ตรงกันและ 2 บรรทัดหลัง

user@box:~$ grep -A 2 my_regex out   
line 5 my_regex
line 6
line 7
user@box:~$ 

grep สายที่ตรงกันและ 2 บรรทัดก่อน

user@box:~$ grep -B 2 my_regex out  
line 3
line 4
line 5 my_regex
user@box:~$ 

Grep สายที่ตรงกันและ 2 บรรทัดก่อนและหลัง

user@box:~$ grep -C 2 my_regex out  
line 3
line 4
line 5 my_regex
line 6
line 7
user@box:~$ 

อ้างอิง: manpage grep

-A num
--after-context=num

    Print num lines of trailing context after matching lines.
-B num
--before-context=num

    Print num lines of leading context before matching lines.
-C num
-num
--context=num

    Print num lines of leading and trailing output context.

3
Nice, ive ต้องค้นหามันสองสามครั้งตอนนี้บางทีฉันอาจจำได้ว่าเป็น - (FTER) -B (EFORE) -C (ONTEXT)
เปิด


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