Computer Science/Linux

[Linux] 유용한 쉘 명령어 (Shell commands) 모음

2021. 8. 17. 13:44

Shell commands의 중요성

  • Unix는 간단하고 굉장히 빠른 툴로 구성된다: 각각의 툴은 하나의 작업만 수행함.
  • 이들의 조합으로 복잡한 작업을 해낼 수 있다.
  • 파일에서 필요한 정보를 뽑거나 rough하게 확인할 때 유용하다:  ex) GFF 파일 (General Feature Format)을 전반적으로 확인하는 등

 

Redirection (Shell operators: >, <, |)

Streams in Unix

Unix에는 다음과 같은 표준 입출력 시스템을 가지고 있다.

표준 입출력

이때 Shell operators (>, <, |)를 이용하여 redirection이 가능한데, 그 결과 더 복잡한 작업을 수행할 수 있다.

 

Redirection: > (write to file)

>를 사용하면 stdout의 내용을 파일에 적을 수 있다.

 

Redirection: < (read from file)

<를 사용하면 file의 내용을 읽어올 수 있다.

 

Redirection: | (Pipelining)

|를 사용하여 Unix commands를 연결할 수 있다 (Piping, redirects stdout to stdin, useful to combine tools). 이를 통해 복잡한 작업을 수행할 수 있다. 전 단계에서 얻은 결과를 다음 프로그램으로 넘겨주면서 작업이 진행된다.

 

Shell 기본

Executable script

아래와 같이 script가 실행되지 않는다면, chmod +x를 통해 script를 실행가능한 파일로 바꿔줄 수 있다.

$ ./test.sh
bash: test.sh: command not found...

$ ls -l test.sh 
-rw-r--r-- 1 user group 1000 Aug 3 14:00 test.sh

$ chmod +x test.sh

$ ls -l test.sh
-rwxr--r-- 1 user group 1000 Aug 3 14:00 test.sh

$ ./test.sh

 

Subshells

$( )을 통해 새로운 process를 생성하여 subshell을 구성한다. subshell의 결과는 stdout에 작성된다.

# Subshell의 결과 출력
$ echo $(ls "*.txt")

# Subshell의 결과를 변수로 저장
$ VAR=$(ls "*.txt")

# 오늘 날짜 파일 저장
$ touch $(date -I)

 

Loop

# For loop: whitespace로 구분된 요소에 대해서 loop
# 폴더의 csv 파일을 모두 txt 형식으로 변환
for file in *.csv; do
   convert $file "$(basename $file .csv).txt"
done

# 1, 2, 3 출력
for i in "1 2 3"; do echo $i; done # 1 2 3
for i in "1 2 3"; do echo $i; done # 1\n2\n3\n

# While loop: whitespace를 무시 + line에 대해 iterate
grep "apple" fruits.txt | while read line ; do
   echo $line
done

 

Keyboard shotcut

  • CTRL + R: 이전 명령어를 검색할 수 있다.
  • CTRL + L: 스크린 Clear
  • CTRL + A: 라인의 시작으로 커서 이동 
  • CTRL + E: 라인의 끝으로 커서 이동

 

이전 명령어 확인

$ ls
hi2.txt  hi.txt

$ !!
ls
hi2.txt  hi.txt

 

Braces 사용

$ echo file.{jpg,txt}
file.jpg file.txt

 

유명한 shell commands

ls: list files and directories

어떤 파일이나 폴더가 존재하는지 알 수 있다.

# 가장 많이 사용: 모든 정보를 출력하고자 할 때
$ ls -al
$ ls -al dic/

# ~: HOME의 shortcut, HOME에 어떤 것들이 있는지 확인할 때
$ ls ~

# *: Wild card
$ ls dic/*.txt	#.txt만 찾고 싶을 때
$ ls dic/*[0-9]*	# 0~9 사이의 숫자가 든 파일을 찾고 싶을 때

$ 역순으로 정렬하고, 그룹 권한을 출력하지 않으며, time & date로 정렬할 때
$ ls –rot

 

cd: change directory

working directory를 바꿀 때 사용 가능

$ cd [DIR]

# Parent directory로 이동할 때
$ cd ..

# HOME으로 이동할 때
$ cd
$ cd ~

 

rm: remove

파일 제거 기능. 파일은 즉시 사라지며, 복구가 어렵기 때문에 굉장히 주의해야한다.

# Remove folder (-r: recursively //–f: Don’t ask me the permission)
$ rm -rf [DIR]

# kill whole Linux system. 유저에게 allowed된 파일은 모두 제거한다.
$ rm –rf /

 

cat: concatenate

파일 출력 (prints file to stdout)

$ cat [FILE]

# -e: control characters and ASCII (ex. newlines control characters 확인 가능)
$ cat -e [FILE]

# -n: line number 추가 가능
$ cat -n [FILE]

 

head/tail: show first/last n lines in a file or stream

파일의 시작/끝 부분만 출력

$ head [FILE]
$ tail [FILE]

# -n: 출력 행 개수 지정 가능
$ head -n 10 [FILE]
$ tail -n 10 [FILE]

$ tail -n +6 # 마지막에서 6번째 줄까지 출력

 

wget: web get

웹에서 파일 다운로드

$ wget '[LINK]'

# -O: 파일 이름 지정 가능
$ wget -O file.gtf.gz '[LINK]'

 

wc: word count

파일이나 stream의 lines, words, bytes의 수를 셀 수 있다 (File feeling을 얻을 수 있음).

# character 수 확인 가능
$ wc -c file.fasta # 이는 newline character와 header line을 모두 포함한 값이다 (주의)

# line 수 확인 가능
$ wc -l file.fasta

 

gunzip: uncompress gzip files

gz 형식의 파일을 압축 해제할 수 있다.

$ gunzip file.gz

# 압축된 상태에서도 파일을 읽을 수 있다.
$ gunzip -c file.gz | head

 

less: visualizes large files on the console

$ less [FILE]

# CTRL+F 다음 페이지
# CTRL+B 이전 페이지
# q: quit and return to the prompt
# ↑, ↓: move backwards and forwards
# word + ENTER: Search (n: 다음 결과)

# –S: line wrapping (line을 더 이쁘게 보여준다). ←, →로 이동 가능.
$ less -S [FILE]

 

grep: find patterns in file

# gene을 가진 모든 line을 print
$ grep “gene” file.gtf

# "gene"을 가진 모든 line을 print
$ grep “\"gene\"” file.gtf

# pattern을 색깔로 highlight
$ grep --color “gene” file.gtf

# single word로 나온 것만 출력 (gene_version 등은 무시)
$ grep -w “gene” file.gtf

# 특정 패턴 제외
$ grep -v “gene” file.gtf

# 정규표현식 사용 가능
$ grep "[REGEX]" file.txt 
$ grep -v "^>" sequence.fasta # ^는 시작을 의미, header 제외
$ grep "A\|B" file.txt # match A or B
$ grep "[0-9][0-9]" file.txt
$ egrep "[0-9]{2}" file.txt # extended regular expression

# Only matched parts만 출력한다 (Line 전체 출력 X)
$ grep -o “gene” file.gtf

# 대소문자 구분 X
$ grep -i “gene” file.gtf

# 이전 줄 확인 가능
$ grep -B 1 “gene” file.gtf

 

uniq: remove duplicate elements in a sorted list

# 중복 행이 있다면 제거하고 출력한다.
$ uniq file.txt

# 중복 행만 출력한다.
$ uniq --repeated file.txt

# 연속되어 같은 것의 개수를 함께 출력한다.
$ uniq -c file.txt
$ sort file.txt | uniq -c # 보통 sort를 한 이후 사용

 

sort: sort output

$ sort file.txt

# 첫번째 열에 desired key가 있을 때
$ sort -k 1b,1 file1 > file1.sorted

# 각 행의 개수 세기
$ sort file.txt | uniq –c

# 각 행의 개수로 정렬
$ sort file.txt | uniq –c | sort –nr

 

chmod: change permission of file

# 파일을 실행 가능한 상태로 만들기.
$ chmod +x file.sh
$ bash file.sh

 

join

# 두 파일에서 중복되는 부분을 file3에 저장 (file1과 file2는 미리 정렬이 된 상태여야한다)
$ join file1.sorted file2.sorted > file3

# '-a': join이 되지 않은 lines를 출력한다.
$ join -a 1 file1.sorted file2.sorted # file1.sorted에 존재하는 unpairable lines 출력
$ join -a 2 file1.sorted file2.sorted # file2.sorted에 존재하는 unpairable lines 출력

 

tr: replace character in a file

# 특정 글자 바꾸기
$ echo "abcde" | tr 'bc' '12' # Result: ab12de

# 특정 기호만 제거 가능
$ echo '"""gene_name "Gene_A";"""' | tr -d '"|;' # Result: gene_name Gene_A

 

awk: a powerful tool to process text files

큰 파일(특히 Line by linetsvcsv ) query하는데 굉장히 유용한 tool로서, 이를 만든 사람의 이름에서 한 글자씩 따서 AWK라고 이름 지어졌다.

# 가장 기본 (핵심), -F는 column separator
$ awk -F ',' '{print $5}' # print the 5th column, read CSV
$ awk -F '{print $5}' # print the 5th column, read TSV (default)

$ awk ‘$1 == “1”’
$ awk ‘$1 == “1” {print $0;}’ # $0는 whole line, 생략 가능

# Columns간 계산 가능
$ awk '{ print $1,$3/$2 }' countries-1977.tsv

# Field attribute 사용 가능: ==, !=, >, <, ~ (matches REGEX)
$ awk '$4 ~ "Asia|Europe"' countries-1977.tsv # 4번째 열이 Asia나 Europe인 lines만 출력

# Multiple attribute 사용 가능: && (AND), || (OR)
$ awk '$4 == "Asia" || $4 == "Europe"' countries-1977.tsv

# For loop (END는 process가 종료된 이후 실행 됨)
$ awk '{a[$1] += $2} END {for (i in a){ printf "%s,%s\n", i, a[i];}}' file.tsv
$ awk '$4=="Asia"{popSum+=$3;} END {print "Total Population: ", popSum;}' file.tsv # Asia의 인구 수

# AWK 파일 실행
$ ./file.awk

# AWK 파일의 함수를 command line에서 실행 (functions.awk의 write 함수)
$ awk -F"\t" -f functions.awk -e '{print write($1, $2)}'

 

AWK에는 predefined variables가 존재한다.

  • NF (number of fields): column이 몇 개인지 모를 때 알 수 있다.
  • NR (number of records): 각각의 line이 record. 예를 들어 5번째 line을 출력할 때 사용할 수 있다. (never reset to zero).
  • FNR (File Number of Records): 각각의 line이 record (automatically reset to zero each time a new file is started).
$ awk ‘{print NF}’ file.tsv | wc –l # wc –l 결과와 다를 수 있는데, 이는 wc가 newline characters의 수를 찾기 때문에 마지막 line이 new line character를 갖고 있지 않는 경우 'wc -l' 값이 1 더 작을 수 있다.

# Join 기능
$ awk 'NR == FNR { old[$1] = $0; next; } $1 in old { print old[$1]"\t"$0; }' file1.txt file2.txt
$ ./join.awk file1.txt file2.txt # 위 내용을 join.awk에 저장한 후 수행

 

그 외 유명한 shell commands

  • pwd show present working directory ($ pwd)
  • mkdir make a directory ($ mkdir [DIR])
  • mv move, 파일 이름을 바꿀 때도 사용 가능하다 ($ mv [FROM] [TO])
  • cp copy files ($ cp [FROM] [TO])
  • top show running processes, 실행 프로그램 확인 ($ top)
  • touch creates an empty file ($ touch [FILE])
  • man manual of any command, command의 help page를 보여준다 ($ man [command])
  • which 프로그램 경로 (path) 확인 ($ which [프로그램명])
  • vi open interactive text editor($ vi [FILE])
  • diff compare two files
  • ps list running processes, 현재 동작하는 process 확인 가능 ($ ps -ef)
  • kill kill running process, 특정 process 중단 가능 ($ kill -9 [PID])
  • sed a powerful tool to process text files
  • cut

 

minor

  • split
  • colrm
  • fmt
  • tr
  • shuf
  • xargs
  • tac
  • rev
  • comm
  • paste
  • printf

 

생물정보학에서 사용될 수 있는 유용한 작업들 (Shell commands for bioinformatics)

FASTA 파일

# ATGC 개수 세기
$ grep -v ">" file.fasta | grep -o '.' | sort | uniq –c

# 파일에 A나 a가 총 몇 개인지 확인 가능 ("^"는 line 시작을 의미)
$ grep -v "^>" file.fasta | grep –o “[A|a]” | wc –l
$ grep -v "^>" file.fasta | grep –o –i “a” | wc –l

# AATCTAAATCTA sequence를 가진 파일의 header를 확인 가능
$ grep –B 1 "AATCTAAATCTA" file.fasta

# id를 기준으로 sequence grep
$  tr '\n' '@' < multi.fasta | sed 's/>/#>/g' | tr '#' '\n' | grep "id_10" | tr '@' '\n'

 

GFF (General Feature Format) 파일

# "gene"을 포함한 line을 알파벳 순으로 정렬한 후 10번째 line까지 출력.
$ grep -w "gene" file.gff | sort | head

# "gene"을 포함한 line의 수?
$ grep -w "gene" file.gff | wc -l

# Count how many exons are on chromosome 2 in GFF file
$ awk -F '\t' '$1 == "2" && $3 == "exon"' file.gtf | wc -l

# Count total exon length (GFF file: 1-based)
$ awk -F '\t' '$3 == "exon" {sum+=$5-$4+1}END{print sum}' file.gtf

# Feature type의 분포
$ awk -F '\t' '{print $3}' file.gtf | sort | uniq -c

 

유명한 프로그램 목록 (Sequence bioinformatic helpers)

  • bedtools BED/GFF/GTF file에서 range를 overlap하기 위한 도구
  • seqkit FASTA/FASTQ files에 대한 swiss knife (grep, subset, 등)
  • samtools SAM/BAM file에서 mapped read data를 가공
  • gffread GFF/GTF file에 대해 여러 가지 작업 가능 (convert, extract, query, 등)
  • bioawk biological data를 위한 awk
  • taxonkit taxonomic tasks를 위한 tool
  • NCBI EUtils NCBI data를 console에서 접근
  • ncbi-genome-download Genbank/Refseq genomes/proteins/annotations 에서 파일을 다운로드

 

 

Reference

  1. https://wizardzines.com/comics/bash-tricks/

 

 

 

728x90
반응형