Linux에서 awk 명령을 사용하는 방법

리눅스 환경에서 awk는 강력한 텍스트 처리 도구이자 스크립트 언어입니다. 이 도구의 핵심 기능들을 소개합니다.

awk라는 이름의 유래

awk 명령어의 이름은 1977년 처음 개발한 세 사람의 성 이니셜에서 따왔습니다. 그들은 알프레드 아호(Alfred Aho), 피터 와인버거(Peter Weinberger), 그리고 브라이언 커니건(Brian Kernighan)입니다. 이 세 사람은 전설적인 AT&T 벨 연구소 출신의 유닉스 시스템 개발자들입니다. 이후 다양한 사람들의 기여를 통해 awk는 지속적으로 발전해 왔습니다.

awk는 단순히 스크립트 언어에 그치지 않고, 명령줄에서 텍스트를 처리하는 데 매우 유용한 도구입니다. 더 자세한 내용은 GNU awk 매뉴얼에서 확인하실 수 있습니다.

패턴, 규칙 및 동작

awk 프로그램은 패턴과 동작으로 이루어진 규칙들로 구성됩니다. 입력 텍스트가 특정 패턴과 일치하면 정의된 동작이 실행됩니다. 패턴은 중괄호({}) 안에 기술되며, 패턴과 동작이 합쳐져 하나의 규칙을 형성합니다. 전체 awk 프로그램은 작은따옴표(‘)로 감싸서 작성합니다.

가장 단순한 awk 프로그램의 형태를 살펴봅시다. 패턴이 없는 경우, 입력된 모든 텍스트 줄과 일치하게 됩니다. 즉, 지정된 동작이 모든 줄에 대해 수행됩니다. who 명령어의 출력을 예시로 사용해 보겠습니다.

다음은 who 명령어의 표준 출력 결과입니다.

who

여기서 모든 정보가 필요한 것이 아니라 사용자 계정 이름만 보고 싶을 수 있습니다. who 명령어의 출력을 awk로 전달한 다음, awk에게 첫 번째 필드만 출력하도록 명령할 수 있습니다.

awk는 기본적으로 공백, 줄의 시작 또는 끝으로 구분된 문자열을 필드로 인식합니다. 각 필드는 달러 기호($)와 숫자로 식별됩니다. 따라서 $1은 첫 번째 필드를 나타내며, 이를 print 동작과 함께 사용하여 첫 번째 필드를 출력할 수 있습니다.

다음 명령을 실행해 보세요.

who | awk '{print $1}'

awk는 각 줄에서 첫 번째 필드를 출력하고 나머지 부분은 무시합니다.

필요한 만큼 필드를 출력할 수 있으며, 쉼표를 사용하여 여러 필드를 구분하면 awk는 각 필드 사이에 공백을 추가하여 출력합니다.

사용자가 로그인한 시간 (네 번째 필드)도 함께 출력하려면 다음과 같이 명령어를 입력합니다.

who | awk '{print $1,$4}'

awk에는 몇 가지 특수한 필드 식별자가 있습니다. 다음은 전체 텍스트 줄과 마지막 필드를 나타냅니다.

$0: 전체 텍스트 줄
$1: 첫 번째 필드
$2: 두 번째 필드
$7: 일곱 번째 필드
$45: 45번째 필드
$NF: “필드 수(Number of Fields)”를 의미하며, 마지막 필드를 나타냅니다.

데니스 리치(Dennis Ritchie)의 짧은 인용문이 담긴 텍스트 파일을 불러와 보겠습니다. 데니스 리치:

cat dennis_ritchie.txt

이제 awk를 사용하여 이 인용문의 첫 번째, 두 번째, 마지막 필드를 출력해 보겠습니다. 터미널에 텍스트가 한 줄로 표시되지만, 실제로는 하나의 텍스트 줄입니다.

다음 명령어를 입력합니다.

awk '{print $1,$2,$NF}' dennis_ritchie.txt

여기서 ‘단순함’은 텍스트 줄의 18번째 필드이지만, 우리가 알고 있는 것은 그것이 마지막 필드이며, $NF를 사용하여 해당 값을 가져올 수 있다는 점입니다. 마침표(.)는 단순히 다른 문자로 처리됩니다.