참조 원문 : How To Search Using The Awk Utility
관련 글 : awk 기초, awk에서 변수 사용, 6가지 awk 트릭
사실 검색만 놓고 따져보면 awk는 grep과 비교해 그리 큰 메리트가 없습니다만 awk의 본래 목적은 검색이 아니라 검색한 내용의 일부를 추출하는 것이기 때문에 awk를 사용하려면 검색 방법을 알아야 할 필요가 있습니다. 아래는 awk의 기본 문법입니다.
awk <search pattern> {<program actions>}
awk로 검색을 할 때는 아래처럼 두 슬래시(/) 사이에 검색할 문자열을 넣습니다. 참고로 문자열에서 대소문자를 구분합니다.
/Debian/
아래의 두 명령어는 같은 결과를 출력하는데 그 이유는 검색의 기본 기능은 화면에 대한 출력이기 때문입니다.
awk ‘/Debian/’
awk ‘/Debian/’ {print}
만약 “debian”과 “Debian”을 모두 검색하고 싶다면 아래처럼 정규식을 사용할 수 있습니다.
/[Dd]ebian/
줄의 시작 부분을 검색하려면 “^” 문자를, 끝 부분을 검색하려면 “$” 문자를 사용합니다.
/^Debian/
/Debian$/
아래는 d부터 m까지 소문자를 검색하는 경우입니다.
/[d-m]/
다음 숫자를 검색하는 경우입니다.
/[0-9]/
두 문자열 중 하나라도 일치하는 것이 있는 줄을 검색할 때는 파이파(|) 문자를 두 문자열 사이에 넣습니다. 그리고 이렇게 파이프(|)처럼 쉘이 해석하는 문자가 포함된 경우에는 쉘이 문자열을 맘대로 해석하지 않고 awk에게 온전히 넘겨주게 하기 위해 싱글 쿼트(‘)를 사용합니다. 사실 아래의 문자열에는 달러($), 백 쿼트(`), 이스케이프(\ 로 시작) 문자가 없기 때문에 더블 쿼트(“)를 써도 같은 결과를 얻을 수 있지만 습관을 위해 awk에서는 싱글 쿼트를 쓰는 것이 좋다고 할 수 있겠습니다. 왜 싱글 쿼트(또는 아래의 경우 더블 쿼트도 포함)를 써야 하는지에 대한 자세한 정보는 이 포스트를 참고하시기 바랍니다.
awk ‘/Iceweasel|Epiphany/’ access_log
파일의 첫 번째 필드를 검색하려면 “$1″로 첫 번째 필드를 검색할 것임을 지정하고 “~” 문자로 해당 필드에서 문자열을 검색할 것임을 알립니다.
awk ‘$1 ~ /^192.168.5.103$/’ access_log
반대로 위의 상황에서 특정 문자열을 검색 결과에서 제외하려면 아래처럼 느낌표(!) 문자를 사용합니다.
awk ‘$1 !~ /^192.168.5.103$/’ access_log
아래는 ‘Debian’이라는 문자열이 있는 줄을 검색한 후 각 줄의 1번째와 20번째 필드를 출력하는 방법입니다.
awk ‘/Debian/’ access_log | awk ‘{print $1,$20}’
아래는 연속된 여러 줄을 출력하는 방법입니다.
awk ‘NR == 10,NR == 15’ access_log
그리고 아래는 사용할 수 있는 연산자입니다.
< 미만
<= 이하
== 일치
!= 불일치
>= 이상
> 초과
또한 AND 연산을 위한 &&와 OR 연산을 위한 ||도 사용이 가능합니다. 아래는 이를 이용하여 10번째 이상의 줄에서 첫 번째 필드가 두 IP 중 하나인 줄을 찾는 내용입니다.
awk ‘((NR >= 10) && ($1 == “192.168.5.103″)) || ($1 ==”192.168.5.104″)’ access_log
문자열 안에 넣을 수 있는 이스케이프 문자들은 아래와 같습니다.
\n 줄 바꿈 (라인 피드)
\t 수평 탭
\b 백스페이스
\r 캐리지 리턴
\f 폼 피드