2016-07-29 4 views
0

여러 줄의 일부 데이터를 정규식으로 한 줄로 바꾸고 싶습니다.정규식으로 만 Perl에서 데이터를 피벗하는 방법은 무엇입니까?

데이터는 HTTP 교환의 시작 및 끝 통지와 하나 이상의 행에 기록 된 세부 사항으로 구성됩니다. 그것은 (거의) 작동

(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO (\[com\.LoggingFilter\]) \(([^)]+)\) (\d+) \* Server in-bound request 
(?=\5 > (.+) 
[\s\S]* 
\5 > user-agent:\s*(.+) 
[\s\S]* 
(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO \3 \(\4\) \5 \* Server out-bound response 
\5 < (\d+) 
[\s\S]*) 

: 다음 작업을 수행하는 정규식입니다 VIEW regex in action. 긍정적 인 모습으로 보존 된 일부 세부 정보는 정규 표현식 교체 후에도 유지됩니다.

"88598";"2016-07-29";"00:00:08,262";"2016-07-29";"00:00:08,262";"http-10.2.3.4-8080-14";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/ 
"88599";"2016-07-29";"00:00:08,382";"2016-07-29";"00:00:08,382";"http-10.2.3.4-8080-8";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/" 
(...) 

대신이 작동하는 것 같다

"88598";"2016-07-29";"00:00:08,262";"2016-07-29";"00:00:08,262";"http-10.2.3.4-8080-14";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/"88598 > GET http://1.2.3.4:8080/service/api/ 
<garbage data here> 
"88599";"2016-07-29";"00:00:08,382";"2016-07-29";"00:00:08,382";"http-10.2.3.4-8080-8";"Java/1.7.0_79";"303";"GET http://1.2.3.4:8080/service/api/"88599 > GET http://1.2.3.4:8080/service/api/ 
(...) 
+0

정규 표현식, 출력 및 얻고 자하는 출력을 제공했습니다. 그게 다 훌륭해. 우리가 누락 된 부분은 입력 데이터의 예입니다. –

+2

@DaveCross 정규 표현식 데모에 있습니다. – horcrux

+2

"정규식만으로"하는 것은 좋지 않은 방법입니다 (비효율적입니다). 라인 단위 또는 블록 방식을 고려해야합니다. –

답변

0

의 다음과 같은 결과를 얻을 방법 :

(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO (\[com\.LoggingFilter\]) \(([^)]+)\) (\d+) \* Server in-bound request 
(?=\5 > (.+) 
[\s\S]* 
\5 > user-agent:\s*(.+) 
[\s\S]* 
(\d+-\d+-\d+) (\d+:\d+:\d+,\d+) INFO \3 \(\4\) \5 \* Server out-bound response 
\5 < (\d+) 
[\s\S]*)[\s\S]*?((?=\n.*Server in-bound request)|(?![\s\S])) 

Here 데모.

+0

'서버 인바운드 요청 '이 가비지에 나타나면 최종 결과에 저장됩니다. 참조 : https://regex101.com/r/tS9aD7/2 – Stephan

+0

어떤면에서는 쓰레기와 쓰레기를 구별 할 수있는 기준이 있어야합니다. '\ n. * Server in-bound request '가 쓰레기에 나타날 수 있다면, 나타날 가능성이 적은 것으로 교체하십시오. \ d + INFO + \ [com \ .LoggingFilter \] \ ([^)] + \) \ d + \ * 서버의 전체 예를 들어, '\ n \ d + 인바운드 요청? [here] (https://regex101.com/r/tS9aD7/3)를 참조하십시오. – horcrux

+0

패턴을 찾으려면 패턴이 많이 필요하며 실제 파일이 샘플보다 클 것으로 의심됩니다. 이 패턴 때문에 결과적으로 후진 제한에 빨리 도달 할 수 있습니다. * 단 정규식 접근법 *이 적절하지 않다고 생각하더라도 단계 수를 줄이기 위해 패턴을 개선하려고했습니다. 결과는 https://regex101.com/r/lT4vV4/1에서 확인할 수 있습니다. –

관련 문제