Làm thế nào để hiển thị các dòng sau mỗi grep khớp cho đến khi khớp cụ thể khác?


45

Tôi biết rằng bằng cách sử dụng công "-A NUM"tắc, tôi có thể in số dòng cụ thể sau mỗi trận đấu. Tôi chỉ tự hỏi liệu có thể in các dòng theo dõi cho đến khi tìm thấy một từ cụ thể sau mỗi trận đấu. ví dụ: Khi tôi tìm kiếm "Word A", tôi muốn xem dòng chứa "Word A" và cả các dòng sau nó cho đến dòng có chứa "Word D".

bối cảnh:

Word A
Word B
Word C
Word D
Word E
Word F

chỉ huy:

grep -A10 'Word A'

Tôi cần đầu ra này:

Word A
Word B
Word C
Word D

Câu trả lời:


74

Có vẻ như bạn muốn in các dòng giữa ' Word A' và ' Word D' (đã bao gồm). Tôi đề nghị bạn sử dụng sedthay vì grep. Nó cho phép bạn chỉnh sửa một phạm vi luồng đầu vào bắt đầu và kết thúc với các mẫu bạn muốn. Bạn chỉ nên yêu sedcầu in tất cả các dòng trong phạm vi và không có dòng nào khác:

sed -n -e '/Word A/,/Word D/ p' file

Bất kỳ lời khuyên nào về cách làm cho nó trở nên độc quyền (cho bất kỳ tình huống chung nào, không chỉ của OP)?
2rs2ts

4
@ 2rs2ts để làm cho nó độc quyền, chỉ cần thêm | sed -e '1d;$d', đó là xóa dòng đầu tiên và cuối cùng
holroy

Và nếu bạn muốn loại trừ tất cả các dòng giữa - nghĩa là, bạn muốn xem các dòng nằm ngoài hai kết quả khớp - thì: sed -n -e '/pattern A/,/pattern D/d; p'Điều này có nghĩa là "xóa từ mẫu A sang mẫu D và in mọi thứ khác". Thật không may, trận đấu này là tham lam. Điều đó có nghĩa là nếu các mẫu A và D xuất hiện nhiều lần, bạn sẽ khớp từ mẫu đầu tiên A đến mẫu cuối cùng D. Tôi sợ Perl hoặc Python là bạn của bạn nếu đó là trường hợp.
fbicknel

16

Tại sao không sử dụng awk?

awk '/Word A/,/Word D/' filename

2
sed dường như có thể làm điều này hiệu quả hơn nhiều nếu một số lượng lớn các tập tin có liên quan. awk có thể dễ nhớ hơn, nhưng sed dường như đáng ghi chú trong não tôi.
JimNim

1
awk là vượt trội nếu Word Drơi trên cùng một dòng với Word A, và có thể ở nơi khác, ví dụ Word A Word D\nWord Dvới sed sẽ hiển thị hai dòng trong đó awk sẽ hiển thị một dòng. Ngoài ra, người ta vẫn có thể sử dụng các biến với awk, ví dụ: awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file"vì vậy sed có thể hiệu quả hơn nhưng khi xử lý các tìm kiếm của hai chuỗi có thể hoặc không thể nằm trên cùng một dòng, awk chắc chắn đáng tin cậy hơn.
S0AndS0

Dường như awk xử lý tốt hơn trường hợp tệp chứa các chuỗi ABvà bạn chỉ muốn nắm bắt những gì giữa mỗi chuỗi như vậy. có vẻ như sed không theo những ngữ nghĩa này trong trường hợp của tôi ít nhất.
Matan

9
perl -lne 'print if /Word A/ .. /Word D/' file

hoặc là

cat file | perl -lne 'print if /Word A/ .. /Word D/'

1
+1 để truy cập downvote ổ đĩa. Tôi vẫn sẽ sử dụng sedcho việc này, trừ khi bạn cần sức mạnh của biểu thức chính quy Perl để chọn các dòng phân định.
tripleee

Những người đã viết sed trong thập niên 70 phải biết ơn :-)
Matan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.