ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Linux] awk명령어에 대해 알아보자
    IT Study/OS 2026. 1. 23. 21:18

    awk 

    단순한 명령어가 아닌 데이터를 한 줄씩 읽으면서 사용자가 정의한 규칙(패턴)에 맞는지 검사하고 그에 따른 동작을 수행하는 프로그래밍 언어 = 특정 패턴을 포함하는 줄을 찾아내는 프로그래밍 언어 

     

    정말 간단히 말해서 파일 내에서 패턴을 검색하고 수행하는 명령어이다. 

     

    일차하는 내용을 찾으면 해당 줄을 출력하거나 카운터를 증가시키는 등의 동작(action)을 수행한다. 

    grep과 유사하지만 강력한 명령어로 간단한 산술 연산이 가능해 보고서나 표를 작성하는데 유용하다. 

    명령줄에 지정된 파일이나 표준 입력(standard input)으로부터 데이터를 읽어 들인다. 

     

    프로그래밍 언어인 만큼 내용이 많으니 하나씩 살펴보자 ! 


    Format 형식 

    # 별도의 프로그램 파일을 불러와서 실행 
    awk -f program-file [file-list]
    # 명령줄에 직접 프로그램을 입력하여 실행
    awk program [file-list]

     

     

    Options & Arguments 옵션 및 인자 

    • 옵션: -f 옵션을 사용하지 않으면 명령줄의 첫 번째 인자를 프로그램으로 인식
      -f(file): awk가 첫 번째 인자로 주어진 program-file에서 프로그램을 읽어오도록 함 
    • 인자: 
      program-file: awk프로그램이 담긴 파일의 경로
      program: 명령줄에 직접 포함된 awk 프로그램, 별도의 파일 없이 짧고 간단한 프로그램을 작성할 때 사용
      file-list: awk가 처리할 일반 파일들의 경로(입력 파일들)

     

    Description 상세 설명 

    • 구성: awk프로그램은 패턴(pattern)과 동작(action)이 포함된 하나 이상의 줄로 구성 
      형식: pattern { action } 
    • 작동 방식: 
      - 패턴을 사용해 입력 파일에서 줄을 선택 
      - 동작은 반드시 중괄호 { } 로 묶임 → 이를 통해 패턴과 동작을 구분 
      - 패턴에 의해 선택된 모든 줄에 대해 지정된 동작 실행 
      - 프로그램에 패턴이 없으면 입력 파일의 모든 줄을 선택 
      - 프로그램에 동작이 없으면 선택된 줄을 그대로 표준 출력으로 복사(출력) 
      - awk는 입력 파일(file-list)의 첫 번째 줄을 읽어 program-file에 있는 각 패턴과 비교
      - 패턴이 일치(match)하면 해당 패턴에 연결된 동작(action)수행 
      - 일치하지 않는 경우, 아무런 동작도 하지 않음 
      - 첫 번째 줄에 대한 비교가 끝나면 다음줄로 넘어가 파일의 끝까지 이 과정 반복 

    결국 awk는 내가 원하는 모양(패턴)을 찾아서, 내가 원하는 일(동작)을 시키는 언어이다. 

    { }가 없으면 그냥 찾아서 보여주기만 하고 
    { } 안에 내용을 적으면 계산을 하거나 특정 열만 뽑아내는 복잡한 일을 시킬 수 있다. 

     

     

    Patterns 패턴 설정 방법 

    • 정규 표현식(Regular Expression): 슬래시 / /사이에 정규 표현식을 넣어 패턴으로 사용 
    • 비교 연산자: 필드나 변수가 특정 조건에 맞는지 테스트 
      • ~ : 정규 표현식과 일치하는가?
      • ! ~ : 정규 표현식과 일치하지 않는가? 
    • 관계 연산자: 숫자 or 문자의 크기를 비교
      • < , <=, ==, !=, >=, > : 리눅스 명령어를 다룰 정도면 .. 이정도는 알거라 생각한다 !!
    • 불린(Boolean) 연산자: 여러 패턴을 조합할 수 있다. 
      • || (Or), && (And) 
    • 범위 지정 및 특수 패턴 
      • 범위 선택: 두 패턴을 쉼표(,)로 구분하면 첫 번째 패턴이 나타나는 줄부터 두 번째 패턴이 나타나는 줄까지의 모든 범위를 선택 
      • 특수 패턴(BEGIN & END)
        - BEGIN: 파일을 읽기 전에 가장 먼저  실행, 주로 변수 초기화나 제목 출력에 사용 
        - END: 모든 파일을 다 읽은 후에 마지막으로 실행(합계나 평균 결과를 출력) 

     

    Actions 동작 설정 방법 

    awk 명령어의 action부분은 특정 패턴이 일치했을 때 어떤 일이 발생하게 만듦 
    • actions생략 시, awk는 기본적으로 { print } 가 있는 것으로 간주 = 일치하는 레코드를 그대로 표준 출력으로 복사
    • 출력의 확장: print명령어 뒤에 인자를 붙여 원하는 내용만 출력 가능
      - >: 출력의 결과를 파일로 저장 
      - >> : 기존 파일 끝에 덧붙이기
      - |(파이프라인): 다른 프로그램의 입력으로 보냄 
    • 구분자: print가 출력하는 항목들을 쉼표(,)로 구분하면 출력 시 항목 사이에 출력 필드 구분자가 들어감 

     

    Variables 변수 

    awk에서 사용하는 내장 변수 목록 
    변수 의미(Description) 기본값
    NR 현재까지 읽어 들인 레코드(줄) 번호  1,2,3,..
    $0  현재 읽고 있는 줄 전체 내용 -
    NF 현재 줄에 있는 필드(열)의 개수 -
    $1 ~ $n 현재 줄의 n번째 필드(열)의 내용 -
    FS 입력 필드 구분자(데이터를 쪼개는 기준) 공백 or 탭
    OFS 출력 필드 구분자(결과를 낼 때 사이사이에 넣는 값) 공백
    RS 입력 레코드 구분자
    NEWLINE(엔터키) 기준으로 여기까지가 한 줄(레코드)이다. "라고 인식
    NEWLINE(엔터키) 
    ORS 출력 레코드 구분자 NEWLINE(엔터키) 
    FILENAME 현재 처리중인 입력 파일의 이름  -

     

     

    Functions 함수 

    awk에서 숫자나 문자열을 조작할 수 있는 몇 가지 내장 함수 제공 
    • length: 인자로 주어지는 문자열의 글자 수(길이)반환, 인자 없으면 현재 읽고 있는 줄(레코드) 전체의 길이 반환 
    • int: 인자의 소수점 아래를 버리고 정수 부분만 반환
    • substr(string, index, length): 특정 문자열(string)의 index위치부터 length만큼의 길이를 가진 부분 문자열(substring)을 추출 

     

    Operators 연산자

    awk에서 사용 가능한 산술 연산자 
    • 기본 연산: + , - , * , / , % 
    • 증감 연산: ++, -- 
    • 대입 연산 +=, -=, *=, /=, %=

    Example 

    컴퓨터 언어를 배울 때 가장 중요한 것, 많이 쓰는 것이다. (코딩은 팔뚝으로 하는 것이라고 했슨) 그러니 예제를 통해 익혀보겠다. 

     

    - data.txt 

    센서 A,B,C,D에서 측정한 온도, 압력 결과를 나타낸 짧은 txt파일이다. 
    Sensor_A 25.4 1013
    Sensor_B 30.2 1020
    Sensor_C 22.1 1011
    Sensor_D 35.8 1005

     

    우선 data.txt를 사용하여 대표적인 3가지 경우부터 살펴보자 

    • { print } - 동작만 있는 경우 
    $ <commandStudy>awk '{ print }' data.txt
    Sensor_A 25.4 1013
    Sensor_B 30.2 1020
    Sensor_C 22.1 1011
    Sensor_D 35.8 1005

    패턴이 생략되었다. 패턴이 없으면 awk는 입력 파일의 모든 줄을 선택하고 모든 내용을 표준 출력으로 복사해 보여주고 있다. 

     

    •  /Sensor/ - 패턴만 있는 경우 
    $ awk '/Sensor/'  data.txt
    Sensor_A 25.4 1013
    Sensor_B 30.2 1020
    Sensor_C 22.1 1011
    Sensor_D 35.8 1005

    동작{ } 이 생략되었다. 동작이 없으면 awk는 기본적으로 { print } 가 있는 것으로 간주한다.

    따라서 이 프로그램은 파일 내용 중 "Sensor"라는 문자열을 포함하는 모든 줄을 찾아서 화면에 출력한다. 

     

    • /Sensor/ { print NR $1} - 동작과 패턴 모두 있는 경우 
    $ <commandStudy>awk '$3 > 25  { print NR $1 }' data.txt
    1Sensor_A
    2Sensor_B
    3Sensor_C
    4Sensor_D

    /Sensor/가 포함된 모든 문장에서 첫 번째 변수가 NR(줄 번호)와 함께 출력된다. 

     


    • END 사용해보기
    $ <commandStudy>awk '{ sum += $3 } END { print "Average Pressure:", sum/NR}' data.txt
    Average Pressure: 1012.25

    sum+=$3를 통해 데이터를 모으고 이 과정이 끝난 뒤, 평균값을 한 번 출력한다. 

     

    만약 END를 사용하지 않으면, 매번 출력하기에 이런 출력값을 볼 수 있다. 

    $ <commandStudy>awk '{sum += $3 } {  print "Average Pressure:", sum/NR}' data.txt
    Average Pressure: 1013
    Average Pressure: 1016.5
    Average Pressure: 1014.67
    Average Pressure: 1012.25

     

    • 조건문 사용해보기 
    $ <commandStudy>awk '$2 < 30 {sum1 += $2; sum2 += $3 } END { print "total of column two is " sum1; print "total of column three is " sum2 }' data.txt
    total of column two is 47.5
    total of column three is 2024

     

    $2(온도)가 30이하일 때, $2(온도)의 합계와 $3(압력)의 합계를 구한다! 

    그럼 25.4 + 22.1 을하면 47.5값이 나오고, 

    1013 + 1011을 하면 2024값이 나온다. 

     

    • 범위(,) 사용해보기 
    $ <commandStudy>awk 'NR == 1, NR == 4' data.txt
    Sensor_A 25.4 1013
    Sensor_B 30.2 1020
    Sensor_C 22.1 1011
    Sensor_D 35.8 1005

    NR==1 : '줄 번호가 1번인 지점부터 시작해라'라는 시작점 패턴

    , : 범위를 나타내는 기호 

    NR == 4 : '줄 번호가 4번인 지점에서 끝내라'라는 종료점 패턴 

     

    • Length 사용해보기 
    $ <commandStudy>awk 'length > 0 {print;count ++} END { print count "lines"}' data.txt
    Sensor_A 25.4 1013
    Sensor_B 30.2 1020
    Sensor_C 22.1 1011
    Sensor_D 35.8 1005
    4lines

    해당 레코드의 길이가 0을 넘을 때 count값에 더해주고 총 몇줄인지 반환한다 

     

    • ~ 연산자 사용해보기 
    $ <commandStudy>awk '$2 ~ /[5-9]/ { print; count++ } END { print count " lines"}' data.txt
    Sensor_A 25.4 1013
    Sensor_D 35.8 1005
    2 lines

    $2(온도)에 5~9의 숫자가 있는지 확인하고 있다면 더해주기 ! 

     

    • 중복 제거 
    $ <commandStudy>cat data.txt                        
    Sensor_A 25.4 1013
    Sensor_B 30.2 1020
    Sensor_C 22.1 1011
    Sensor_S 22.1 1011
    Sensor_D 35.8 1005
    Sensor_E 35.8 1005
    
    $ <commandStudy>awk '$3 != remember { remember = $3; print}' data.txt
    Sensor_A 25.4 1013
    Sensor_B 30.2 1020
    Sensor_C 22.1 1011
    Sensor_D 35.8 1005

    data를 조금 바꿔보았다. 레코드를 한 줄씩 돌면서 $3을 저장한다. 그리고 이 저장한 값이 동일하지 않을 때(중복이 없을 때)출력한다 ! 

     


    아직 알쏭달쏭하지만 awk 명령어를 사용해서 데이터를 분석할 때 유용하게 사용할 수 있을 것 같다. 

    계속 연습해야지 .. ~ 

Designed by Tistory.