2010. 12. 9. 08:51

Linux/Ubuntu의 awk, cut, od, unix2dos


column 추출하기

awk 명령은 일종의 잘 정제된 program lanugage입니다. awk 명령은 많은 작업을 하지만, 여기에서는 text의 column을 추출하는 일을 알아보도록 합니다.

$ ps auwx | awk '{print $1,$11}'
USER COMMAND
root /sbin/init
root [kthreadd]
root [migration/0]
root [ksoftirqd/0]
root [watchdog/0]
root [events/0]
root [cpuset]
root [khelper]
root [netns]
...
$ ps auwx | awk '/greenfish/ {print $11}'
/usr/lib/gvfs//gvfs-fuse-daemon
sshd:
sshd:
sshd:
sshd:
awk
$ ps auwx | grep greenfish | awk '{print $11}'
/usr/lib/gvfs//gvfs-fuse-daemon
sshd:
sshd:
sshd:
sshd:
grep
awk '{printf $1,$11}'을 통해 ps 명령의 1, 11 번째 column을 출력하도록 합니다.

기본적으로 swk 명령은 space로 column이 구분되었다고 가정하는데, -F 옵션을 이용하여 다른 구분자를 지정할 수 있습니다.
$ awk -F: '{print $1,$5}' /etc/passwd
root root
daemon daemon
bin bin
sys sys
sync sync
games games
...

그리고 cut 명령으로도 비슷한 결과를 볼 수 있습니다. 구별자를 :로 하는 이전의 awk 예제는 다음과 같습니다.
$ cut -d: -f1,5 /etc/passwd
root:root
daemon:daemon
bin:bin
sys:sys
sync:sync
...

cut 명령은 field를 범위지정할 수 있습니다. 다음은 /etc/passwd의 1 부터 5까지의 column을 출력합니다.
$ cut -d: -f1-5 /etc/passwd
root:x:0:0:root
daemon:x:1:1:daemon
bin:x:2:2:bin
sys:x:3:3:sys
sync:x:4:65534:sync
games:x:5:60:games
...

-를 사용하여 범위를 지정하는 대신 특정 column 이하 모든것을 출력할 수 있습니다. 다음은 5번째 column 이하를 모두 출력합니다.
$ cut -d: -f1- /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
...

보통 ps 명령과 같이 space로 구별된 column의 결과를 출력하는데 awk 명령을 선호하기는 합니다. 그리고 /etc/password file같이 ,나 :로 구별된 결과를 출력하는데에는 cut 명령을 선호합니다.


다른 format의 text file을 변환하기

unix 계열의 text file은 다른 줄바꿈 문자(\n)가 사용됩니다. DOS/Window는 \r\n가 사용됩니다. od 명령으로 이런 특수문자를 볼 수 있습니다.

$ od -c -t x1 myfile.txt
0000000   1  \n   2  \n   3  \n   g   r   e   e   n   f   i   s   h
         31  0a  32  0a  33  0a  67  72  65  65  6e  66  69  73  68  20
0000020   i   s       m   y   i   d  \n   h   e   l   l   o   ,       w
         69  73  20  6d  79  69  64  0a  68  65  6c  6c  6f  2c  20  77
0000040   o   r   l   d   !  \n
         6f  72  6c  64  21  0a
0000046
$ cat myfile.txt
1
2
3
greenfish is myid
hello, world!

제대로된 화면 출력을 위해서 상이한 환경에서 복사된 파일은 다음과 같이 file을 변환하여 사용하는 것이 필요합니다. 해당 명령은 tofrodos package가 설치되어야 합니다(sudo apt-get install tofrodos).
$ unix2dos < myunixfile.txt > mydosfile.txt
$ cat mydosfile.txt | dos2unix > myunixfile.txt