공통 키워드 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이 포함된 몇 줄(\r\n이 포함된 1줄 또는 \r\n이 포함된 10줄이 있을 수 있음)을 캡처하고 싶습니다. 이제 키워드가 있는 파일의 모든 줄에는 \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
두 패턴 사이의 모든 라인 선택을 사용할 수 있습니다 . 여기서는 각 입력 줄을 인쇄하는 기본 동작을 sed -n
억제하는 데 사용하고 있습니다 . 다음으로, 두 패턴 사이의 라인을 일치시킨 다음 인쇄하도록 sed
지시합니다 ( ).sed
/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
.
그들은 모두 당신이 원하는 결과를 줄 것입니다.