我有一个文件,其中包含以下示例行,每行都有一个公共关键字 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 =>
[H00,P00001121] CONTEXT=PARAMETER : TRANSACTIONID => 20190801143344970"
[H00,P00001121] CONTEXT=PARAMETER : KEY_TYPE => SERVICEID
[H00,P00001121] CONTEXT=PARAMETER : ORDERSOURCESYSTEM =>
假设文本类似于这样(我将在编辑更新提供的文本后更新我的答案)
你可以这样做(假设你的文本输入被命名为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 =>
[H00,P00001121] CONTEXT=PARAMETER : TRANSACTIONID => 20190801143344970"
[H00,P00001121] CONTEXT=PARAMETER : KEY_TYPE => SERVICEID
[H00,P00001121] CONTEXT=PARAMETER : ORDERSOURCESYSTEM =>
但是,有些事情告诉我您可能正在寻找其他东西,例如仅获取选定的行文本,或者可能是一些其他分组,如果是这样,请更新您的问题。
答案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
.
它们都会给出您想要的结果。