안녕하세요? 정리하는 개발자 워니즈입니다. 이번시리즈는 awk 명령어에 대해서 정리를 해보는 시간을 갖어보려고 합니다.
리눅스에서는 다양한 명령어가 있지만, 그중에서 자주 사용하고 특히 정리가 필요로 하는 부분은 정리를 하고자 합니다.
awk 명령어(1/3)sed 명령어(2/3)
cut 명령어(2/3)
awk 란 패턴 탐색과 처리를 위한 명령어로 간단하게 파일에서 결과를 추려내고 가공하여 원하는 결과물을 만들어내는 유틸리티입니다.
즉 파일에서 패턴이 일치하는 행을 찾아서 지정한 조치를 수행해주는 명령어이다. awk 명령은 사용자가 정의한 명령어 집합을 이용하여 파일 집합과 사용자가 제공한 확장 표현식을 한번에 한 행씩 비교한 다음 확장 정규식과 일치하는 모든 행에 작용하여 특별한 작업을 해 준다.
초기 개발자 Aho, Weinberger, Kernighan의 첫글자를 따서 이름지어진 awk는 GNU 프로젝트에서 만들어진 텍스트 처리 프로그래밍 언어로 유닉스 계열의 OS에서 사용 가능하며, 텍스트 형태로 되어있는 입력 데이터를 행과 단어 별로 처리해 출력한다.
2. awk 기본 명령어
awk [OPTION...] [awk program] [ARGUMENT...]
OPTION
-F : 필드 구분 문자 지정.
-f : awk program 파일 경로 지정.
-v : awk program에서 사용될 특정 variable값 지정.
awk program
-f 옵션이 사용되지 않은 경우, awk가 실행할 awk program 코드 지정.
ARGUMENT
입력 파일 지정 또는 variable 값 지정.
awk 명령에서 awk program은 ‘ ‘(single quotation marks) 안에 작성합니다.
아래와 같이 pattern이 생략되는 경우, 매칭 여부를 검사할 문자열 패턴 정보가 없기 때문에 모든 레코드가 선택되고, action을 생략하면, 기본 액션인 print가 실행되는 것입니다.
# pattern 생략.
$ awk '{ print }' ./file.txt # file.txt의 모든 레코드 출력.
# action 생략.
$ awk '/p/' ./file.txt # file.txt에서 p를 포함하는 레코드 출력.
2-3. awk record 적용 방식
pattern과 action에 작성되는 awk program 코드에는 다양한 표현식, 변수, 함수 등이 사용됩니다. 이 중 가장 중요한 변수는 레코드와 필드를 나타내는 변수인데, 하나의 레코드는 $0, 레코드에 포함된 각 필드는 그 순서대로 $1, $2, …, $n 으로 지칭됩니다.
3. awk 사용예제
필자는 주로 awk ‘{print $1}’ 과 같이 단순히 record를 출력해서 사용하는 방법에 대해서만 알고있지만, 아래와 같이 다양한 사용법이 있고, program도 넣어서 만들 수 있기에 다양하게 활용될 수 있다.
awk 사용 예
명령어 옵션
파일의 전체 내용 출력
awk ‘{ print }’ [FILE]
필드 값 출력
awk ‘{ print $1 }’ [FILE]
필드 값에 임의 문자열을 같이 출력
awk ‘{print “STR”$1, “STR”$2}’ [FILE]
지정된 문자열을 포함하는 레코드만 출력
awk ‘/STR/’ [FILE]
특정 필드 값 비교를 통해 선택된 레코드만 출력
awk ‘$1 == 10 { print $2 }’ [FILE]
특정 필드들의 합 구하기
awk ‘{sum += $3} END { print sum }’ [FILE]
여러 필드들의 합 구하기
awk ‘{ for (i=2; i<=NF; i++) total += $i }; END { print "TOTAL : "total }' [FILE]
awk '{max = 0; for (i=3; i max) ? $i : max ; print max}' ./file.txt
$ cat file.txt
1 ppotta 30 40 50
2 soft 60 70 80
3 prog 90 10 20
$ awk '{max = 0; for (i=3; i max) ? $i : max ; print max}' ./file.txt
40
70
90
4. 마치며...
awk 사용법에 대해서 정리를 하면서, 사실 필자가 지금까지 사용해오던것은 정말 기초적인 수준이구나 하는 것을 느끼게 되었습니다. 단순히 print 를 하는것에서만 사용했다면, 이제는 간단한 program logic도 넣을 수 있을것 같습니다.
많은 회사들에서 쉘을 다뤄봤다면, awk 스크립트를 사용할 줄 아냐고 묻는 이유를 이제서야 알것 같습니다.
다음시간에는 필자가 지금까지 만들어왔던 shell script들에 대해서 작성해볼 예정입니다.
이후에는 cut, sed 에 대해서도 정리할 예정이니 많은 기대 부탁드립니다.😄
워니즈 블로그워니즈 깃헙