grep은 마지막 N 줄과 일치합니다.

grep은 마지막 N 줄과 일치합니다.

특정 일치 후에 20개 이상의 줄을 grep하는 명령을 찾고 있습니다.

예:grep "09:55:21,651" mylog_file.log

2018-02-26 09:55:21,651 ERROR  [WebContainer : 0] (CommonAction.java:253) - SITAConnector Error: Empty SITA Response XML
com.ac.ccaswitch.exception.SitaConnectorException: Empty SITA Response XML
        at com.ac.ccaswitch.connector.sita.SITAConnector.sendToSitaQueue(SITAConnector.java:144)
        at com.ac.ccaswitch.entry.CommonAction.performTask(CommonAction.java:212)
        at com.ac.ccaswitch.entry.PaymentServlet.doPost(PaymentServlet.java:85)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1694)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:970)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:508)
        at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:181)
        at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:91)
        at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:878)
        at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1592)
        at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:191)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:454)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:516)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:307)
        at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:84)
        at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
        at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
        at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
        at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
        at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
        at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)

답변1

grep의 -An 스위치를 사용하여 일치 후 n 줄을 가져올 수 있으므로 예를 들어 다음과 같습니다.

grep -A20 "09:55:21,651" mylog_file.log

편집: 귀하의 grep 버전이 -A를 지원하지 않는 것 같습니다. 여기에 사용할 수 있는 작은 스크립트가 있습니다.

#!/bin/sh
file="$1"
pattern="$2"
n="$3"
matches="$(grep -n ${pattern} ${file})"
echo "${matches}" | while read match;  do
    line="${match%%:*}"
    sed -n "${line},$((${line} + ${n} - 1))p" < "${file}"
done

다음과 같이 사용할 수 있습니다.sh script.sh mylog_file.log "09:55:21,651" 20

편집 2: 제가 여기 있는 동안 sed가 이상할 경우를 대비해 sed 대신 head와 tail을 사용하는 솔루션이 있습니다.

#!/bin/sh
file="$1"
pattern="$2"
n="$3"
matches="$(grep -n ${pattern} ${file})"
echo "${matches}" | while read match;  do
    line="${match%%:*}"
    head "-$((${line} + ${n} - 1))" "${file}" | tail "-${n}"
done

관련 정보