본문 바로가기
컴퓨터/리눅스

몇 가지 간단한 리눅스 명령어의 실제 사용예

by adnoctum 2010. 7. 21.

이 글에 나온 실제 사용 예들은 계속 추가할 생각이다.

가장 최근 수정일 : 2010-09-06
2010-08-31
2010-08-10
2010-07-21



각 명령어의 간단한 설명은 이 글의 뒤쪽에 있음.  리눅스의 명령어에 관한 좋은 설명은 아래의 책 (검색링크)에 나와 있다.
easy UNIX, SciTech

자주 사용되는 리눅스 명령어들이 이 책에 자세하게 잘 설명되어 있다.

좋은 책을 보면 막 홍보해주고 싶다는.


  자잘한 리눅스 명령어의 묘미는 입력/출력을 다음 프로그램에 곧바로 집어 넣을 수 있다는 것. 예를 들어 보자. test.txt 파일이 다음의 내용이 다음과 같다고 하자. 각 데이터는 유전자 1개를 나타내는 ID (01045처럼) 와 유전자의 이름(BCL2처럼)으로 되어 있다.

01045:BCL2(-)    00291:CTSD
01045:BCL2(-)    00169:CALR
01045:BCL2(-)    00536:TOP2A

이 상황에서 BIRC5 가 몇 번 나왔는지 알고 싶다면? 그러면 다음과 같이 간단히 해결할 수 있다. 입력으로 주어진 file에서 입력으로 주어진 문자열이 검색될 때에만 출력해주는 egrep 과, 입력으로 주어진 내용의 '줄 수'를 세어 주는 wc 를 연결하여,

egrep BIRC5 test.txt | wc -l


혹은, 위의 파일에 나온 유전자의 전체 수를 알고 싶다면? 위의 파일은 실제로 tab-deliminated (공백은 사실 tab이다) 형식이고, 따라서 위의 내용에서 tab 을 new-line 으로 치환해서 출력하고, 그것을 sort 라는 명령어가 받아서 sorting 을 하고, 그것을 uniq 라는 명령어가 받아서 중복된 것을 없앤 후, 줄 수를 세는 wc 라는 명령어가 받아서 줄 수(결국 유전자 수)를 출력하게 하면 된다. 다음과 같이.

awk -F"\t" '{print $1"\n"$2}' test.txt | sort | uniq | wc -l


혹은 매우 여러 column 을 갖는 파일이 계속 만들어 지고 있다고 해보자. 그 파일 중 처음 2,3,4 번째 column 만, 파일의 내용이 추가된 것을 출력하고 싶다면 다음과 같이 하면 된다.

tail -f test.out.txt | cut -f2,3,4

tail 은 파일의 끝의 몇 줄 (default는 10이다)을 출력한다. -f 는 그 파일에 데이터가 계속 쓰이고 있을 때, 그 뒤 내용을 특정 초마다 계속 출력하라는 의미이다. 여기에, 이렇게 출력되는 내용을 cut 이 받아서 2,3,4 번째 column 만을 다시 잘라서 출력하고 있다. 만약 tail -f 로 나오는 것을 중단하고자 하면 Control + C 를 하면 된다. 물론 background 로 돌던 프로세서는 계속 돌테고 단순히 tail -f 만 끝난 것이다.

또는, 이름이 *.cluster.txt 로 끝나는 파일들 전체에 대하여, 그 안에 Cluster 라는 문자열이 들어 있는 줄 수를 알고 싶다면? 아주 간단히 다음과 같이 하면 된다.

egrep Cluster *.cluster.txt | wc -l


즉, Cluster 라는 문자열이 들어 있는 줄을 출력하는 egrep 에, 그렇게 출력된 줄의 수를 세는 wc -l 을 연결하면 되는 것이다. 이 때, 각 *.cluster.txt 파일은 다음과 같이 생겼다.

INFO:SOURCE_FILE:    NormalBreast_01302_JUN.merged.norm.rank.txt.filtered_0.95.txt
Cluster1    0.179078    580    30069    00018:FLNC    00054:ARF1    00061:ADM    ...
Cluster2    0.667365    54    955    00230:CALB2    00522:CYP24A1    00770:HES1    ...
Cluster3    0.489412    51    624    00070:ALDOA    00173:SLC1A5    00557:ETFB    ...
Cluster4    0.804435    32    399    00061:ADM    00232:S100A10    00526:HBEGF    ...
Cluster5    0.356102    111    2174    00161:ATP2A2    00444:CREM    00501:DCN    ...
Cluster6    0.673171    41    552    00061:ADM    00232:S100A10    00501:DCN    ...
Cluster7    0.632768    60    1120    00161:ATP2A2    00444:CREM    01048:LIFR    ...
Cluster8    0.343953    110    2062    00085:ADRA2C    00100:APP    00161:ATP2A2    ...


사실 이 파일은 그래프의 dense 한 영역을 찾는 MCODE의 알고리즘을 반영한 코드에서 출력한 것이다.


이번에는 다음과 같은 구조를 갖는 파일들에서,
BREAST_CANCER   GSE11121        0.702507        352.596 369.157 GRADE_1 29      GRADE_2 136     00421:MSX2:Msh homeobox 2
BREAST_CANCER   GSE5460 0.444481        156.257 143.272 GRADE_I 27      GRADE_II        32      00421:MSX2:Msh homeobox 2
BREAST_CANCER   GSE2990 0.978588        5.61385 5.61165 GRADE1  34      GRADE2  46      00421:MSX2:Msh homeobox 2
BREAST_CANCER   GSE4922 0.138463        6.58625 6.41815 GRADE1  68      GRADE2  126     00421:MSX2:Msh homeobox 2
BREAST_CANCER   GSE11121        0.0257226       369.157 265.974 GRADE_2 136     GRADE_3 35      00421:MSX2:Msh homeobox 2

각 줄은
<질병이름> <tab> <GSEID> <tab> <p-value> <tab> <mean1> <tab> <mean2> <tab> ... <tab> <gene name>
으로 되어 있는데, 이 중에서 00421의 ID를 가지면서 이름이 MSX 인 유전자이되, p-value 가 0.05 이하인 것만을 출력하고자 할 때는,

[adnoctum@bioism BreastCancer]$ more all_gene_compare*.txt | grep 00421 | grep MSX -i | awk '$3 <= 0.05'
BREAST_CANCER   GSE11121        0.0257226       369.157 265.974 GRADE_2 136     GRADE_3 35      00421:MSX2:Msh homeobox 2
BREAST_CANCER   GSE5460 0.0241282       143.272 114.944 GRADE_II        32      GRADE_III       70      00421:MSX2:Msh homeobox 2
BREAST_CANCER   GSE4922 0.0333665       6.41815 6.11985 GRADE2  126     GRADE3  55      00421:MSX2:Msh homeobox 2
[adnoctum@bioism BreastCancer]$

위처럼 more로 원하는 파일내용을 창으로 뿌리면서, grep 으로 00421과 MSX를 동시에 잡고, 다시 awk 로 3번째 열의 값이 0.05 보다 작은 것만 출력하도록 하면 된다.







자주 사용되는 간단한 명령어들을 살펴 보면 다음과 같다.

* grep [문자열] [file_name] : 조건에 맞는 줄만 출력한다.

* more [file_name] : file의 내용을 화면에 출력하되, 한 화면이 넘어 가면 표시를 중단, 사용자의 입력을 기다린다. Enter 키를 누르면 한 칸 을 더 출력하고, 스페이스바를 누르면 다시 한 화면의 내용을 더 출력해 준다. q 를 누르면 끝난다.

* sort [file_name] : file의 내용을 정렬해서 출력한다.

* uniq [file_name] : 연속된 두 줄이 같은 내용이면 한 줄로 만들어 준다. 이 때, uniq 명령어는 정렬을 하지는 않는다. 따라서 정렬을 하지 않고 uniq 를 하면 자신이 원하던 결과가 안 나올 수 있으니, 그럴 경우 미리 손수 sort를 해야 한다는 것을 잊지 말자.

* cut [file_name] : 원하는 column 만을 출력해 준다. 만약 file이 tab-deliminated text file 이고, 두 번째 column 만 출력하고 싶다, 와 같은 경우 유용하게 쓰인다.

* awk : 뭐랄까... 편집기라고 해야 하나, 하여튼 이것은 너무나 방대해 한 줄로 설명하기 힘들다.

* sed : awk 와 비슷. stream editor 의 약자라는데, stdout 으로 나오는 것에서 주어진 조건에 만족하는 것을 조작하거나, 할 수 있다.

* wc [file_name] : word count. 글자 수나 줄 수를 세어 준다.

* tail [file_name] : 파일의 가장 끝 몇 줄을 출력한다.

* head [file_name] : 파일의 가장 첫 몇 줄을 출력한다.


각각의 명령어에 있어 보다 자세한 설명은 man page를 참고한다.


'컴퓨터 > 리눅스' 카테고리의 다른 글

프로세스 관련 명령어들  (0) 2010.09.06
mv : 파일 이동 및 파일 이름 변경 명령어  (0) 2010.08.31
리눅스 몇 가지 기초 명령어들  (0) 2010.08.21
linux의 top 명령어  (0) 2010.07.03
리눅스의 find 명령  (1) 2010.05.18