[완료] perl oneliner 최적화 질문입니다.
얼마전에 로그파일을 분석할 일이 생겨서 텍스트 파일에서 일정한 패턴 사이에 있는 부분을 긁어오는 script를 만들어보았습니다.
perl -pi -e 'if(/start/){$f=1;};if($f==1){print STDOUT $_;};if(/end/){;$f=0;}' [Target file]
보시다시피 실행시키면 Target file이 다음과 같을 때 'start'가 출현한 라인부터 'end'까지 긁어오게 되있습니다.
Target file >
1
... start ...
2
3
4
... end ...
5
6
...
출력 >
... start ...
2
3
4
... end ...
의도했던데로 잘 돌아가기는 하더군요. 그러나 곧 2가지 문제점을 발견하였습니다.
1. 다음과 같이 명령을 하면 무한루프를 돌면서 ctrl+c가 늦을 경우 시스템을 바보 만들어버리더군요.
perl -pi -e 'if(/start/){$f=1;};if($f==1){print STDOUT $_;};if(/end/){;$f=0;}' *.tmp > a.tmp
출력파일인 a.tmp에 쓰는 동시에 스크립트도 실행하면서 a.tmp의 용량이 무한대로 증가하는 현상인 것 같습니다. 다행히 혼자쓰는 서버여서 서버가 정신 차릴 동안 커피 한 잔 마시고 왔을 뿐이지만 혹여나 중요한 서버에서 이런 실수를 하게 되면 생각만해도 끔찍하네요. 예방할 수 있는 방법이 없을까요?
2. 너무 멋이 없네요(^^;) 회사에서 perl을 즐겨 쓰는 사람이 저 밖에 없는지라, perl의 장점을 널리 알리려면 뭔가 있어보이는 것도 중요하지 않겠습니까! KLDP에서 고수님들이 만드시는 oneliner를 보면 감동이 느껴지거든요.
모쪼록 도와주시면 감사하겠습니다. (__) 굽신굽신
그렇게 복잡하게 하실 필요 없습니다.
.
.
.
.
.
test.txt
Perl에서 범위연산자 ..의 용법중에 다음과 같이
하면 앞의 정규식매칭 줄에서 뒤의 정규식 매칭 줄까지를 뜻하게 됩니다.
결과
그러면 start에서 start 까지 찍어 내려면 어떻게 할까요?
..을 써서 /start/../start/ 를 하면 start가 포함된 줄만 찍힙니다.
이때는 ..이 아니라 ...를 사용해야 합니다. 이유는 ..연산자가 플립플롭처럼 동작하기 때문인데
자세한 건 perldoc( http://perldoc.perl.org/perlop.html#Range-Operators ) 를 보시면 됩니다.
결과
필요한 부분을 뽑아내는 예는 제가 예전에
http://kldp.org/node/100909#comment-469191
에서 언급한 적이 있습니다.
이런걸 perl말고 다른걸로 해보라고 하고
perl로 어떻게 하는지 보여줘 보세요. :)
Perl하시는 분들을 만나시려면
http://doc.perl.kr/twiki/bin/view/Wiki/WebIRC
로 오세요~
펄을 사랑하시는 aero
펄을 사랑하시는 aero 님의 말씀에 첨언하면, awk가 더 간단합니다.
감사합니다.
큰 도움이 됐습니다....
저걸 몰라서 4시간을 헤멘걸 생각하면...아.. 이갈린다..ㅠ_ㅜ
awk 이렇게 사용할수 있군요. 잘라서 필터링하는
awk 이렇게 사용할수 있군요. 잘라서 필터링하는 대만 써서, 신기해 하고 있습니다. 감사합니다.
오오 ㅡ0ㅡ
역시 perl에는 상상을 초월하는 방법이 있군요. 감사합니다.
감사합니다. 배열의
감사합니다.
배열의 내용이 한번에 다 나와서 빠르긴 하지만, 원래 텍스트에 있던 \n가 없어지고 한줄로 나오는군요.
이러면 줄 단위로 처리를 하는 원래 스크팁트가 동작 하지 않습니다.
@, * 모두 해봤습니다만, 마찬가지 입니다.
Professional Logo - stationery design - My logoz
무슨말 하시는 거?
뭐가 안되는지 예제를 보여주심이
댓글 달기