Perl Commandline CookBook
Perl Commandline CookBook ¶Perl은 많은 분야에서 강력한 힘을 가지고 있지만 쉘 커맨드 라인에서 기존의 awk와 sed등을 대체하고 그이상의 많은 일을 해낼 수 있는 강력한 도구입니다. 커맨드라인 펄은 "아는만큼 쓰면된다"는 펄의 장점을 보여주는 가장 좋은 예입니다.
커맨드 라인에서 쓸수 있는 다양한 Perl 팁을 모아봅시다. Perl외의 다양한 방법들도 함께 모아서 비교해보는 것도 좋겠죠?
바로 복사해서 쓸 수 있는 CookBook을 만드는 것이 목적인만큼 팁들을 문서의 앞으로 돌리고 문서의 뒤쪽에 커맨드라인 옵션이나 유용한 문법에 대해 추가하겠습니다.
-- pung96 2007-01-31 23:30:27
1.1.1. 많은 파일들을 한번에 삭제하기 ¶
find -name "*.log" -print | perl -nle unlink
find -name "*.log" -exec rm \{\} \;
find -name "*.log" -print | xargs rm
1000개 지운후에 5초 쉬도록 할 경우
find -name "*.log" -print | perl -nle 'unlink; $.%1000==0 and sleep(10);'
1.1.2. 여러줄의 데이터를 grep하기 ¶perl -0777ne '/(START_FLAG.*?END_FLAG)/s and print $1' list.txt # 파일이 작을때 perl -ne '/START_FLAG/ ... /END_FLAG/ and print;' # 파일이 클때 1.1.3. 리스트 비교 : 복잡한 comm 구현하기 ¶기본 아이디어는 여러 파일을 읽어서 각 라인의 적당한 패턴 혹은 전체 라인을 해쉬 키로 만들고 라인을 해쉬 값으로 만들어서 각각 파일에 대응되는 해쉬에 저장한 후에 키가 각 해쉬에 존재하는지 확인하여 출력합니다. 편의상 스크립트에서 주로 사용하지 않는 심볼릭 레퍼런스를 사용했습니다.
# list1 과 list2 모두에 있는 항목
grep -f list2 list1 perl -e '@a{@ARGV}=q(A..Z);while(<>){$a{$ARGV}->{$_}++};for(keys %A){print $_ if $B{$_}}' list1 list2 perl -ne 'BEGIN{@a{@ARGV}=(A..Z)}{$a{$ARGV}->{$_}++}END{for(keys %A){print $_ if $B{$_} } }' ls.log ls.log2 # list1 에만 있는 항목 grep -vf list2 list1 perl -e '@a{@ARGV}=(A..Z);while(<>){$a{$ARGV}->{$_}++};for(keys %A){print $_ unless $B{$_}}' list1 list2 # list1 + list2 cat list1 list2 | uniq perl -e 'while(<>){$A{$_}++};for(keys %A){print $_;};' # 속도는 좀 느리지만 간단한 방법 perl -e '@s{`cat OLD`}=( ); exists $s{$_} && print for `cat NEW`'
pattern이 list1 과 list2에 모두 매치되는 항목의 list1 항목. 말이 좀 복잡하네요.
perl -e '@A{@ARGV}=qw(L R);while(<>){/(pattern)/ and $A{$ARGV}->{$1}=$_};for(keys %L){print $L{$_} if $R{$_};}' list1 list2
1.1.4. 엑셀처럼 컬럼 계산하기 ¶
cat data.txt | perl -ane '{$avr=$F[2]+$F[3];$sum+=$avr;print "Avr is $avr\n";}END{print "Sum is $sum\n";}'
cat data.txt | awk '{avr=$1+$2;sum+=avr;print "Avr is "avr;}END{print "Sum is "sum;}'
perl -nle '{/(pattern1).*(pattern2)/ and $avr=$1+$2 and $sum+=$avr and print "Avr is $avr"}END{print "Sum is $sum";}' data.txt
1.1.5. 파일 수정하기 ¶
1.1.6. 각 라인의 패턴에 따라 다른 파일(pattern.txt)로 분류하기 ¶
perl -ne '{/(pattern)/ and $H{$1}.=$_;}END{for(keys %H){open F,">$_.txt";print F $H{$_};close F;}' data.txt
|










