2007. 11. 6. 15:02

리스트 비교

리스트를 비교하는 방법에는 "grep -f", "sort, diff", "comm" 등이 대표적이다.
"grep -f" 는 시간이 너무 오래 걸리는 단점이 있지만 diff, comm등은 강력한 도구이다.
하지막 역시 많은 파일과 복잡한 선택기준 앞에서 나의 가장 강력한 도구는 PERL!!

내가 주로 쓰는 커맨드를 소개한다면
perl -nle '/(regex)/ and $h[@ARGV]{$1}=$_;END{map{statement;}keys %{$h[0]}}' file1 file0
주의 할 점은 @ARGV(남은 파일 개수)을 인덱스로 사용하기 때문에 인자로 준 파일순서와 인덱스가 거꾸로라는 것.
위 예제에서 file1이 $h[1], file0 가 $h[0] 에 저장된다.(file1 과 file0의 순서에 주의)
statement를 위해서 여러가지 상상력을 동원할 수 있다.

간단한 예
perl -nle '/(\d{6}-\d{4})/ and $h[@ARGV]{$1}=$_;END{map{ exists $h[1]{$_} and print $h[1]{$_} }keys %{$h[0]}}' file1 file0

file1과 file0에서 123456-1234형태의 패턴(내가 주로 사용하는 런넘버-세그먼트넘버) 을 추출해서 file1과 file0의 공집합의 file1리스트를 출력한다.
비교할 리스트의 성질에 따라 코드는 많이 짧아질 수도 있다.
극단적으로 두 리스트의 똑같은 라인들만 검색하기 위해서는 다음과 같이 할 수도 있다.

perl -e '@s{`cat OLD`}=( ); exists $s{$_} && print for `cat NEW`' fire1 file2
2007. 11. 6. 10:26

터미널의 타이핑 내용을 녹화한다.

가끔 심심할때면 쉘에서 특정 영단어로 시작하는 프로그램들이 어떤것이 있는지 찾아보곤 하는데 얼마전 script 란 주옥같은 명령어를 찾게 되었다. 우왓 내가 모르던 스크립팅 언어인가!!

 script - make typescript of terminal session

말 그대로 작업내용을 녹화해 놓았다가 재생할 수 있다.
  • 녹화
$ script -t 2> timing
        Script started, file is typescript
        $ ls
        Desktop         hax             hog.sh  My Computer             ostg    src
        $ pwd
        /home/jonesy
        $ file hax
        hax: empty
        $ exit
        exit
        Script done, file is typescript

  •  재생
        $ scriptreplay timing
        $ ls
        Desktop         hax             hog.sh  My Computer             ostg    src
        $ pwd
        /home/jonesy
        $ file hax
        hax: empty
        $ exit
        exit


작업하는 모습을 다른 사람에게 실시간으로 보여줄수도 있다.
선생님 :
  $ mkfifo  out 
  $ script -f out

학생 :
 $ cat out

선생님:
 $ 이렇게 이렇게 하는 거예요..
 $ exit

오~~ 멋지다.. 그런데 쓸일은 별로 없을 것 같네..
참고로 screen 으로도 실시간 교육을 할수가 있다는 사실.. 역시 별로 쓸일은 없지만.