捕获关键字时如何grep新行的数据?

捕获关键字时如何grep新行的数据?

我有一个文件,其中包含以下示例行,每行都有一个公共关键字 P00001121 。

[H00,P00001121] CHANNEL__OPEN:TCP_ADDRESS='10.32.130.202' TCP_PORT='80'"
[H00,P00001121] COMMS_QUEUING:RECV='01/08/2019 14:33:45.064410' QUEUE_TIME='00000.000' TO_DEV='
[H00,P00001121] FROM_EXCHANGE:HTTP/1.1 200 OK\r\n
Server: Apache-Coyote/1.1\r\n
Content-Type: text/xml;charset=UTF-8\r\n
Content-Length: 878\r\n
Date: Thu, 01 Aug 2019 04:33:45 GMT\r\n
\r\n
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
[H00,P00001121] CONTEXT=PARAMETER : CLIENTID =>
[H00,P00001121] CONTEXT=PARAMETER : TRANSACTIONID => 20190801143344970"
[H00,P00001121] CONTEXT=PARAMETER : KEY_TYPE => SERVICEID
[H00,P00001121] CONTEXT=PARAMETER : ORDERSOURCESYSTEM =>

我想捕获关键字 (P00001121) 的所有行以及关键字下面包含 \r\n 的几行(可能有 1 行包含 \r\n 或 10 行包含 \r\n以下几行)。现在文件中具有关键字的所有行都包含以下带有 \r\n 的行。我可以使用任何命令,无论是 grep、awk、cut 等,无论哪个命令有效。

[Server: Apache-Coyote/1.1\r\n
Content-Type: text/xml;charset=UTF-8\r\n
Content-Length: 878\r\n
Date: Thu, 01 Aug 2019 04:33:45 GMT\r\n
\r\n
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>]

答案1

检查完 OP 文本输入(参见评论)后,我能够获得原始的格式良好的文本,如下所示:

[H00,P00001121] CHANNEL__OPEN:TCP_ADDRESS='10.32.130.202' TCP_PORT='80'"
[H00,P00001121] COMMS_QUEUING:RECV='01/08/2019 14:33:45.064410' QUEUE_TIME='00000.000' TO_DEV='
[H00,P00001121] FROM_EXCHANGE:HTTP/1.1 200 OK\r\n
Server: Apache-Coyote/1.1\r\n
Content-Type: text/xml;charset=UTF-8\r\n
Content-Length: 878\r\n
Date: Thu, 01 Aug 2019 04:33:45 GMT\r\n
\r\n

[H00,P00001121] CONTEXT=PARAMETER : CLIENTID =&gt;
[H00,P00001121] CONTEXT=PARAMETER : TRANSACTIONID =&gt; 20190801143344970"
[H00,P00001121] CONTEXT=PARAMETER : KEY_TYPE =&gt; SERVICEID
[H00,P00001121] CONTEXT=PARAMETER : ORDERSOURCESYSTEM =&gt;

假设文本类似于这样(我将在编辑更新提供的文本后更新我的答案)

你可以这样做(假设你的文本输入被命名为ex1

cat ex1 | grep -P '\\r\\n|P00001121' 

你会得到:

[H00,P00001121] CHANNEL__OPEN:TCP_ADDRESS='10.32.130.202' TCP_PORT='80'"
[H00,P00001121] COMMS_QUEUING:RECV='01/08/2019 14:33:45.064410' QUEUE_TIME='00000.000' TO_DEV='
[H00,P00001121] FROM_EXCHANGE:HTTP/1.1 200 OK\r\n
Server: Apache-Coyote/1.1\r\n
Content-Type: text/xml;charset=UTF-8\r\n
Content-Length: 878\r\n
Date: Thu, 01 Aug 2019 04:33:45 GMT\r\n
\r\n
[H00,P00001121] CONTEXT=PARAMETER : CLIENTID =&gt;
[H00,P00001121] CONTEXT=PARAMETER : TRANSACTIONID =&gt; 20190801143344970"
[H00,P00001121] CONTEXT=PARAMETER : KEY_TYPE =&gt; SERVICEID
[H00,P00001121] CONTEXT=PARAMETER : ORDERSOURCESYSTEM =&gt;

但是,有些事情告诉我您可能正在寻找其他东西,例如仅获取选定的行文本,或者可能是一些其他分组,如果是这样,请更新您的问题。

答案2

我使用了一些与您类似的输出技巧。

1. 过滤掉匹配的行grep

请注意,您想要的行不包含字符串P00001121。知道了这一点,您就可以grep显示不存在该字符串的所有行:

例子

$ grep -v P00001121 afile
Server: Apache-Coyote/1.1\r\n
Content-Type: text/xml;charset=UTF-8\r\n
Content-Length: 878\r\n
Date: Thu, 01 Aug 2019 04:33:45 GMT\r\n
\r\n
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>

2. 选择一系列行sed

您可以使用sed选择 2 个图案之间的所有线条。在这里,我使用sed -n来抑制sed打印每行输入的默认行为。接下来,我们告诉sed匹配 2 个模式之间的任何行,然后打印它们 ( /p)。

$ sed -n '/pattern1/,/pattern2/p' afile

例子

$ sed -n '/^.*Server/,/^\\r\\n/p' afile
Server: Apache-Coyote/1.1\r\n
Content-Type: text/xml;charset=UTF-8\r\n
Content-Length: 878\r\n
Date: Thu, 01 Aug 2019 04:33:45 GMT\r\n
\r\n

答案3

grep这可以通过、awk、 或 来完成sed

grep -v H00 file.txt

-v开关打印出所有不包含该字符串的行。

sed -n '/Server/,/soap/p' file.txt

这将打印包含这些字符串的行之间的行。

awk '/Server/','/soap/' file.txt

就像上面一样打印出包含这些字符串的行之间的行,但使用awk.

它们都会给出您想要的结果。

相关内容