본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스/유닉스] AWK 명령어 기본적인 사용문법 - NF/NR 그리고 패턴과액션

반응형

[리눅스/유닉스 완전정복 목차]

안녕하세요~~

오늘은 리눅스에서 자주 사용되는 명령어 중 하나인, awk에 대해 작성해보려고 해요. ㅎㅎ

 

awk란 무엇인가

명령어 cut은 자르다라는 의미, 명령어 sed도 Streamlined EDitor의 약자.. 

이렇듯 보통 명령어는 역할의 줄임말인 경우가 많은데

awk는 이와 다르게 이 명령어를 만든 세 사람의 이름을 따서 지어졌습니다. ㅎㅎ

 

awk는 데이터를 내가 원하는 포맷대로 쉽게 가공할 수 있도록 도와주는 명령어인데요

명령어보다는, 커맨드창에서 내가 원하는대로 텍스트를 가공할 수 있게 하는 프로그래밍 언어에 좀 더 가까워요.

아예 awk 프로그래밍 언어라고 하더라구요

 

암튼, 데이터 조작에 특화된 언어인데,

대표적으로 내가 원하는 열에 해당하는 데이터만 추출한다던가,, 

아니면 패턴에 맞는 값만 추출한다던가.. 조건도 걸 수 있어요 연산도 가능~~

우리가 아는 for, if, substr, length, print, begin-end 구절 등등 꽤 익숙한 구절들을 명령구문에서 볼 수 있다는 것도 awk의 특징입니다. 

 

요렇듯 awk는 단순 명령어 느낌보다는 스크립트 언어로 다양하게 확장(?)할 수 있어서 생각보다 간단하게 와닿지 않을 수 있어요.

하지만 문법 몇 가지만 익혀두면 굉장히 유용한 명령어입니다. 개인적으로는 스크립트 같은거 짤 때 활용도가 높은 것 같아요.

awk를 한 번에 다루려면 양이 너무 많으니 조금씩 나눠서 포스팅을 해보려합니다. 오늘은 그 시작 첫번째~!

 

필드와 레코드, NF와 NR

awk에서 텍스트를 조작하려면 알아야 할 개념 중 하나가 필드와 레코드입니당.

레코드는 쉽게 말해 행을 의미하는데요. 필드는 우리가 알고 있는 열 데이터를 의미해요.

awk는 sed명령어처럼 작업을 수행할 때, 한 번에 하나의 행만 가지고 와서 수행해요.

스크립트 언어니까~~~

 

그래서 내가 작업중인 행의 첫번째 열, 두 번째 열, 세 번째 열 이런식으로 접근합니다.

 

♠ 필드

$1하면 첫 번째 열 데이터 의미하고

$2하면 두 번째 열 데이터,

$3는 세 번째 열 데이터..

$n은 n번째 열이겠죠?

 

즉 $n은 n번째 필드값으로 

그림 인풋의 행이 4개라고 가정하면, 인풋에 대한 $1 결과는 "아리 베인 겐지 티모"가 되겠어요.

 

♠ NF

내장변수로 NF라는게 있는데 'the Number of Fields'로 현재 레코드의 필드 개수를 뜻해요.

첫 번째 행에 "아리 한조 디바 애쉬" 요렇게 있으면 NF는 4가 되는겁니다.

위의 예시에서 $NF는 $4랑 동일한거죠.

 

따라서 $NF는 작업행기준 마지막 필드를 의미합니다.

 

♠ 레코드

레코드는 행을 의미해요. awk는 스크립트언어로 한 번에 한 행을 작업합니다.

현재 작업하고 있는 레코드 데이터를 출력하려면 $0을 사용하면 돼요.

$0이 전체 필드를 출력한다는 의미이기 때문입니당

 

♠ NR

NF처럼 NR도 있는데 NR은 전체 행의 개수가 아니라,

작업하던 행의 순번, 즉 현재 몇 번째 레코드를 작업하고 있는지를 담고 있어요.

 

예를 들어, 

NR이 1일 때의 $0을 출력하면 '아리 한조 디바 애쉬'가 나오는거고,

NR이 2일 때의 $0을 출력하면 '베인 ~'가 나오는거고,

NR이 3일 때 $0은 '겐지~'가 되는거죠.

헷갈리지 말기~~~~ 

 

awk 'NR>=10 && NR<=20' input.txt

▶ input.txt 텍스트파일에서 10행에서 20행까지를 보여줘

 

요런 NF, NR과 같은걸 내장변수라고 하는데요, AWK는 다양한 내장변수를 가지고 있답니다.

오늘은 자주사용하는 것만 훑고 내장변수에 대해서는 나중에 따로 더 알아보도록 해요.

 

awk의 기본적인 문법

awk는 파란색 부분을 프로그램 파트라 하는데

프로그램 파트는 일련의 패턴과 액션으로 이뤄져있어요.

즉 하나가 아닌 여러개의 패턴액션이 나올 수 있다는거~

패턴과 액션의 의미는 간단합니다.

 

"레코드가 패턴에 맞으면 액션을 수행한다"

 

여기서 패턴과 액션을 둘 다 꼭 적어줘야 하는건 아니고,

필요에 따라 생략할 수 있어요.

 

♠ 액션이 생략된 경우

액션이 생략됐을 경우, 디폴트로 { print }가 있다고 봅니다.

awk 'NR<=3 {print}' input.txt
awk 'NR<=3' input.txt

즉 위 두 명령어는 같은 코드예요.

첫 번째 명령어에서 액션을 생략하면 두 번째 명령어가 되는거고,

사실 두 번째 명령어는 액션이 없어보이지만, 디폴트로 {print}라는 액션을 갖고 있는거죠.

 

♠ 패턴이 생략된 경우

마찬가지로 패턴이 생략될 수도 있는데요

패턴이 생략되면 조건이 없는거니까, 모든 레코드를 대상으로 합니다.

awk '{print $1}'

위 명령어는 '모든 레코드의 첫 번째 필드를 출력해라'가 되는거죠

 

awk 명령어 사용 예시

[test.txt 파일]

banana one 500
apple four 1000
grapes six 200
tomato two 700

간단하게 test.txt 파일을 테스트용으로 만들어보았어요.


cat test.txt | awk '{print $NF}'

test.txt파일에서 마지막 필드만 뽑아서 출력해줘

결과


 cat test.txt | awk '{print $1,$3}'

test.txt 파일에서 첫 번째 필드와 세 번째 필드를 뽑아줘

결과


cat test.txt | awk 'NR==2{print $1,$3}'

두 번째 레코드에 해당하는 첫 번째 필드와 세 번쨰 필드 값을 출력해줘

결과


cat test.txt | awk '/^ba/{print $1,$3}'
cat test.txt | awk '/mat/{print $0}'
cat test.txt | awk '/mat/{print $NF+500}'

1. ba로 시작하는 레코드를 찾아 첫번째 필드와 세번째 필드 값을 출력해라

2. mat이라는 문자열이 있는 레코드를 찾아 그 행 전체 값을 출력해라

3. mat이라는 문자열이 있는 레코드를 찾아 마지막 필드에다가 500을 더한 값을 출력해라

결과

알고나니 간단하죠?

 

오늘은 awk가 텍스트파일을 바라보는 기초적인 개념과 아주 기본 문법에 대해서만 다뤄봤어요.

도움이 되셨다면 공감은 어떤가요?

남은 awk는 다음 포스팅에서 살펴보도록 해요~

반응형