如何对多行进行Grep以获取该线程下的所有行。我已经试过了grep-A,-B,-C,但这似乎比我需要的要多,有时甚至要少。
$cat text.txt
=====================================================================
[11-23-18 10:07:01:119]::Thread(ABC):request returned
[11-23-18 10:07:01:120]::Thread(ABC):Sending packet 'POST /aq/ConManager HTTP/1.1
Host: localhost:192.168.1.1
User-Agent: gSOAP/2.7
Content-Type: text/xml; charset=utf-8
Content-Length: 1149
Connection: keep-alive
Accept-Encoding: gzip, deflate
SOAPAction: ""
[11-23-18 10:07:01:121]::Thread(XYZ): doing request
[11-23-18 10:07:01:122]::Thread(XYZ): request returned
================================================================
现在,如果我使用grep -A 10 ABC text.txt
,它将输出所有其他行,如thread XYZ
。其中我只想输出所有ABC线程及其行。如果我只使用grep,它将不会在ABC线程之后输出后续行。
您可以使用
awk '/^[[^][]*]::Thread(ABC)/,/^$/' file > newfile
它匹配两个模式之间的一组行,第二个匹配空行,第一个匹配:
^
-行的开始[
-一个[
[^][]*
-除[
和]
之外的0+个字符]
-一个]
::Thread(ABC)
-一个::Thread(ABC)
子串
请参阅在线演示。
这里有一个可能是也可能不是你想要的:
$ awk -v RS="" '/ABC/' file
输出:
=====================================================================
[11-23-18 10:07:01:119]::Thread(ABC):request returned
[11-23-18 10:07:01:120]::Thread(ABC):Sending packet 'POST /aq/ConManager HTTP/1.1
Host: localhost:192.168.1.1
User-Agent: gSOAP/2.7
Content-Type: text/xml; charset=utf-8
Content-Length: 1149
Connection: keep-alive
Accept-Encoding: gzip, deflate
SOAPAction: ""
解释:
$ awk -v RS="" ' # use empty records as record separators
/ABC/ # if there is ABC in the record, print it
' file