2012-11-23 24 views
27

Với grep tôi biết cách đặt ngữ cảnh thành một số dòng cố định. Có thể hiển thị ngữ cảnh dựa trên điều kiện chuỗi tùy ý, như đặt sau ngữ cảnh thành "cho đến dòng trống tiếp theo" không?Làm cách nào để đặt grep sau ngữ cảnh "cho đến dòng trống tiếp theo"?

Hoặc có thể một số kết hợp công cụ khác?

Về cơ bản tôi có một tập tin đăng nhập của các dòng liên tục, với các dòng trống tách "sự kiện" Tôi muốn tìm kiếm một chuỗi trong file log, nhưng hiển thị toàn bộ sự kiện ....

+0

Điều này có thể thực hiện được với các công cụ khác. Nếu bạn đăng một ví dụ, bạn sẽ nhận được câu trả lời cụ thể. –

+0

Bạn có thể muốn sử dụng 'sed' hoặc 'awk' cho điều đó ... – dmckee

+0

Làm thế nào tôi có thể làm ngược lại điều này. Tôi có một tệp nhật ký với ngăn xếp cuộc gọi. Tôi không muốn in một ngăn xếp cuộc gọi nhưng muốn tất cả các ngăn xếp cuộc gọi khác – Nikole

Trả lời

24

Nghe có vẻ như bạn cần sed:

sed -n '/pattern/,/^$/p' file 

Không in theo mặc định (-n). Đối với các dòng khớp với /pattern/ tối đa dòng trống /^$/, in.

+0

Lưu ý rằng điều này không hiển thị toàn bộ sự kiện, nhưng bỏ lỡ những dòng của sự kiện trước mẫu. –

+2

Để xóa: Lệnh có định dạng '' , ''. Nó tìm các dải địa chỉ bao gồm (phạm vi dòng) bắt đầu bằng một kết quả của 'mẫu' và kết thúc bằng một kết quả của một dòng trống sau (khớp'^$ '). Đối với mỗi chức năng phạm vi được thực hiện ('p': in dòng đến). Để loại trừ các dòng trống khỏi đầu ra, hãy sử dụng tệp «sed -n '/ pattern /,/^ $/{/^$ /! P}'. Ở đây '/^$ /! P' có nghĩa là in bất kỳ dòng nào không khớp với'^$ '. – valid

+1

Điều này làm việc hoàn hảo cho tôi, với một ngoại lệ: đầu vào nguồn của tôi có dòng mới kiểu DOS (\ r \ n), vì vậy tôi phải làm điều này thay vào đó: 'sed -n '/ pattern /,/^ \ r $/p 'tệp' – bmaupin

7

Dưới đây là một (thử nghiệm) awk giải pháp, tách ra vào nhiều dòng cho dễ đọc:

awk '/pattern/ {do_print=1} 
    do_print==1 {print} 
    NF==0 {do_print=0}' input_file 

Kịch bản này cũng sẽ in các dòng trống vì vậy nó dễ dàng hơn để thị tách các khối phù hợp khác nhau. Nếu bạn không muốn các dòng trống, trao đổi các 2 dòng do_print==1 {print}NF==0 {do_print=0}

Giải thích:

  • awk: gọi công cụ awk - nó đánh giá đầu vào một dòng tại một cách tuần tự thời gian.
  • '...'.: mọi thứ được đính kèm theo dấu ngoặc đơn được đưa ra cho awk làm hướng dẫn. Trong trường hợp này, chúng tôi thực hiện các hướng dẫn được trích dẫn trên mỗi dòng.
  • /pattern/ {do_print=1}: bất cứ khi nào một dòng chứa "pattern", bật do_print cờ
  • do_print==1 {print}: nếu cờ do_print được thiết lập để vào, in dòng hiện tại.
  • NF==0 {do_print=0}: NF là viết tắt của Số trường. awk phân định từng dòng theo dấu cách và tab theo mặc định để ngắt dòng vào các trường. Trong trường hợp này trivially một dòng trống không có lĩnh vực - vì vậy chúng tôi tắt do_print cờ ngừng in khi chúng ta thấy một phù hợp với NF == 0
18

Một giải pháp đơn giản là:

awk '/pattern/' RS= input-file 

Thiết RS đến chuỗi rỗng làm cho awk coi các dòng trống là dấu phân tách bản ghi và quy tắc đơn giản /pattern/ gây khó khăn khi in bất kỳ bản ghi nào khớp với mẫu, có thể là bất kỳ biểu thức chính quy mở rộng nào.

Các vấn đề liên quan