Làm thế nào để grep 2 hoặc 3 dòng, một dòng chứa văn bản tôi muốn và những dòng khác ngay bên dưới nó?


32

Đây là ảnh chụp nhật ký lỗi:

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:195)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:222)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:208)
    at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:139)
    at com.rabbitmq.client.impl.ChannelN.basicGet(ChannelN.java:645)

Tôi thực hiện lệnh sau:

cat foo.log | grep ERROR để có được một OP như:

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message

Tôi nên thực hiện lệnh nào để có được đầu ra như

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
    com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel

tức là, cũng grep dòng (s) sau mẫu?


com.rabbitmq.clientvăn bản trên dòng tiếp theo bắt đầu từ bắt đầu hoặc có một số khoảng trống ở phía trước của nó?
Eugen Konkov

Câu trả lời:


62

Chỉ cần làm một:

grep -A1 ERROR

Các -A1bảo grep để bao gồm 1 dòng sau trận đấu. -Bbao gồm các dòng trước trận đấu, trong trường hợp bạn cũng cần điều đó.


oh đúng, điều đó cũng sẽ hữu ích
theTuxRacer

12
-Cbao gồm các dòng cả trước và sau trận đấu ('C' là viết tắt của 'bối cảnh', tôi tin).
Marius Gedminas

5

Đối với một cách di động hơn, có awk

awk '/ERROR/{n=NR+1} n>=NR' foo.log

Hoặc có thể bạn muốn tất cả các dòng thụt vào sau?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log

2
: O đó là thông tin tốt, nhưng thay vì quá mức! Tuy nhiên, thật tốt khi biết một phương pháp khác :)
theTuxRacer

Tôi ước tôi hiểu làm thế nào những awklệnh đó hoạt động.
Firefeather

3
@Firefeather awk.freeshell.org là một tài nguyên tốt để học awk. Trang hướng dẫn sử dụng GNU awk cũng khá tốt.
geirha

1

Tôi đã tìm thấy giải pháp này:

cat apache.error.log | grep -Pzo '^.*?Exception In get Message.*?\ncom\.rabbitmq.*?(\n(?=\s).*?)*$'

(\n(?=\s).*?)*nghĩa là:

  • \n tìm dòng tiếp theo
  • (?=\s) bắt đầu từ ký tự khoảng trắng
  • .*? cho đến hết dòng
  • (...)* Tìm những dòng như vậy nhiều lần

Tái bút Bạn có thể tạo mẫu này \ncom\.rabbitmq.*?nếu dòng thứ hai bắt đầu từ khoảng trắng\s

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.