Skip to content

Linux 기본명령어 awk #
Find similar titles

You are seeing an old version of the page. Go to latest version

Structured data

Category
Computer science

awk #

NAME #

awk – 패턴 탐색 과 처리를 위한 언어

SYNOPSIS #

간단하게 파일에서 결과를 추려내고 가공하여 원하는 결과물을 만들어내는 유틸리티이다. 즉 파일에서 패턴이 일치하는 행을 찾아서 지정한 조치를 수행해주는 명령어이다. awk 명령은 사용자가 정의한 명령어 집합을 이용하여 파일 집합과 사용자가 제공한 확장 표현식을 한번에 한 행씩 비교한 다음 다음, 확장 정규식과 일치하는 모든 행에 작용하여 특별한 작업을 해 준다. awk 명령의 패턴 탐색은 grep 명령의 패턴 탐색보다 더 일반적이고, 입력 텍스트 행에 대해 여러 가지 조치를 실행할 수 있으며 awk 명령 프로그래밍 언어는 컴파일을 필요로 하지 않고, 변수, 수치 함수, 문자열 함수 및 논리 연산자를 사용할 수 도 있다. 보통은 sed명령과 조합하여 많이 사용하기도 한다.

기본적인 사용법은 다음과 같다.

$ awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]

기본형식 : awk 'patten' filename 조건
awk '{action}' filename 몇번째 필드
awk 'pattern {action}' filename 무슨 조건에 몇 번째 필드 
1 (필드) 개행으로 구분한다 
2 자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어 
3 입력 데이터로는 표준 입력, 여러 개의 파일 또는 다른 프로세스의 결과를 사용 할 수 있다 
4 사용자가 지정한 패턴 검색이나 특별한 작업수행 위해 파일을 행 단위로 조사한다 
5 $0은 모든 필드

설명 #

  • GNU 프로젝트에서 만들어진 텍스트 처리 프로그래밍 언어이다.
  • 유닉스 계열의 OS에서 사용 가능하다.
  • 텍스트 형태로 되어있는 입력 데이터를 행과 단어 별로 처리해 출력한다.
  • 초기 개발자 Aho, Weinberger, Kernighan의 첫글자를 따서 이름이 지어졌다.
  • 기본적으로 패턴과 패턴을 처리하는 명령어 짝을 늘여놓은 구조로 이루어져 있는데, 입력으로부터 한 줄씩을 읽어서 정규 표현식으로 조건이 맞는지를 검사하고 참으로 판명되면 그 줄에 대해 명령어를 실행하는 형식이다.
  • 일반적으로 다음과 같은 구조의 명령행을 사용한다.
  • awk 'pattern'
  • awk '{action}'
  • awk 'pattern {action}'

사용법 #

$ awk -F delim '{ print $x }'

기본적인 사용법은 위의 형태로 많이 사용한다. awk 명령어와 구분자 그리고 출력할 내용을 써 주면 된다. $ awk '{print $1}' file 파일의 첫 번째 필드를 출력한다, 첫 번째 필드는각 행의 맨 왼쪽 경계에서 시작 공백문자로 구분하여 출력하는데 이 경우에는 첫번째가 된다.

특정 폴더 내에 있는 파일 목록만 가져오는 경우를 생각해보면 ls 명령어를 사용해서 > 로 리다이렉션 시켜서 vi로 작업하는 방법을 사용할 수 도 있고 그냥 복사해서 한 라인에 하나씩 오도록 엔터를 쳐서 사용해도 된다. 그러나 이 경우 awk명령어를 사용하면 보다 편하게 사용할 수 있다. 먼저 ls -al 를 해 보면 다음과 같이 상세 정보를 출력한다.

$ ls -al 
-rw-r--r--   1 kylee  wheel  10235636 11 18 13:44 201611101584be7224a770
-rw-r--r--   1 kylee  wheel   1897350 11 18 13:44 201611101584be7224a770.gz
-rw-r--r--   1 kylee  wheel     70597 11 18 13:44 201611101584be7224a770.gz.csi
-rw-r--r--   1 kylee  wheel  10368400 11 18 13:44 201611101584be8191b560
-rw-r--r--   1 kylee  wheel   1927540 11 18 13:44 201611101584be8191b560.gz
-rw-r--r--   1 kylee  wheel     63101 11 18 13:44 201611101584be8191b560.gz.csi
-rw-r--r--   1 kylee  wheel   9907325 11 18 13:43 201611101584be8e59c610
-rw-r--r--   1 kylee  wheel   1849363 11 18 13:44 201611101584be8e59c610.gz
-rw-r--r--   1 kylee  wheel     77322 11 18 13:44 201611101584be8e59c610.gz.csi
-rw-r--r--   1 kylee  wheel   8893514 11 18 13:44 201611101584be99aab100
-rw-r--r--   1 kylee  wheel   1673036 11 18 13:44 201611101584be99aab100.gz
-rw-r--r--   1 kylee  wheel     66183 11 18 13:44 201611101584be99aab100.gz.csi

이 상황에서 맨 마지막에 있는 파일을 복사해서 편집해도 되지만 불편하다. 간단히 다음과 같이 사용하면 된다.

$ ls -al | awk '{ print $9}'

이렇게 명령을 내려주면 awk 프로그램이 공백으로 분리해서 마지막 즉 9번째가 파일명이 되는데 요 번호를 $9와 같이 써 주면 깔끔하게 다음과 같이 출력이 된다.

201611101584be7224a770
201611101584be7224a770.gz
201611101584be7224a770.gz.csi
201611101584be8191b560
201611101584be8191b560.gz
201611101584be8191b560.gz.csi
201611101584be8e59c610
201611101584be8e59c610.gz
201611101584be8e59c610.gz.csi
201611101584be99aab100
201611101584be99aab100.gz
201611101584be99aab100.gz.csi

다른 방법을 쓸 필요도 없이 간단하게 내가 원하는 결과를 얻을 수 있다. >를 이용해서 파일에 저장해서 따로 사용할 수 있다. $ history | awk '{ print $2 }' \ | sort | uniq -c | sort -nr | head -3

이 예는 리눅스를 사용하면서 가장 많이 내린 명령어를 찾아서 출력해주는 간단한(?) 명령어 조합이다. 특히 생물학 데이터를 다룰 때는 특정 형식으로 되어 있는 경우가 많다. 다음과 같이 bed 파일이 있는데 이 파일을 gbrowse 사용하기 위해서는 직접 사용할 수 없고 GFF3 형식으로 변환해주면 브라우저에서 그림으로 확인할 수 있는 상태가 된다. 예제로 애기장대의 bed파일 내용인데 이 내용을 아래 명령어로 바꿔주면 별도의 프로그래밍 없이도 bed --> gff로 변경할 수 있다. chr1 2025600 2027271 AT1G06620.10 + 2025617 2027094 0 3541,322,429, $ awk '{print $1”\tawk\tmRNA\t”$2”\t”$3”\t” \ $5”\t”$6”\t0\t”$4 }’ example.bed 그러면 내가 원하는 형식으로 변경이 되어 사용할 수 있다.

몇 가지 사용법을 추가로 확인하면 다음과 같다. awk '/Arabidopsis/{printf $1, $2}' file

파일에서 Arabidopsis를 포함하는 행들의 첫 번째와 두 번째 필드를 출력한다. 이 경우에는 특정 단어로 시작하는 행을 찾아서 공백으로 구분한 뒤 필요한 컬럼을 출력한다.

df | awk '$2 > 10000 '

df ( 현재 디바이스 정보 ) 명령어를 통해 출력되는 내용 중 두 번째 필드가 10000보다 큰행을 출력한다.

date | awk '{print "Month : $2\n Year"$6}'

date 명령어를 통해 출력되는 시간 정보 중 두 번째 필드와 여섯번 째 필드를 서로 개행 하여 출력하면 월과 년을 출력할 수 있다.

awk '{print NR, $1, $3}' file

NR(하나의 레코드를 처리한 뒤 1 이 증가하는 변수)을 사용하여 레코드 번호와 함께 파일의 내용대로 출력한다. 그러면 각 라인별로 번호를 매겨 정보를 줄 수 있다.

awk -F : '/root/{print $0}' /etc/passwd

이 경우에는 보통 \t이나 공백으로 라인을 나누는데 특이한 구분자로 구분 되어 있는 경우 별도로 구분자를 지정해 줄 수 있는데 -F 다음에 구분자를 써 주면 된다. 이 경우 " : " 구분자를 기준으로 필드를 나누며 root를 포함하는 행을 출력한다. /expression/이 되는데 // 안에는 정규표현식을 사용하여 원하는 패턴을 찾을 수도 있다.

awk -F : '\^[ab]\{print $1}' file

a나 b로 시작하는 행의 첫 번째 필드를 출력한다.

awk -F '[\t]' '{print $1, $2, $3}' file

Tab 으로 필드를 구분하며 첫 번째, 두 번째, 세 번째, 필드를 출력한다.보통 엑셀에서 작업한 파일을 텍스트 파일로 변환하면 TSV, CSV형태로 저장한다. 이때 구분자는 \t(탭)이나 ,(콤마)로 구분이 되는데 이 경우 구분자를 지정해주면 편하게 작업할 수 있다.

awk '$1 ~ /[aA]TG/' seq.fasta

~는 특정 레코드나 필드 내에서 일치하는 정규 표현식 패턴이 존재하는지 검사 위해 쓰인다

awk '$1 !~ /*$' protein.fasta

첫 번째 필드가 *로 끝나지 않는 행들을 출력. 즉 종료 서열이 없는 서열을 찾을 때.

SEE ALSO #

더 자세한 내용이 필요한 경우 Texinfo 매뉴얼을 참조하면 된다. 현재 컴퓨터에 infoawk가 정상적으로 설치되어 있다면 아래 커맨드를 입력하여 매뉴얼 내 'awk' 정보를 확인할 수 있다.

info awk

혹은 $ man awk

0.0.1_20210630_7_v33