패턴 검색 및 처리 언어

awk '패턴 { 액션 }' 파일

 

 < 동작 방식 >

* 패턴이 생략되면 모든 레코드에 대한 액션이 실행

  1. 파일에 있는 1행을 읽음
  2. 레코드를 획득
    • 예를 들어 파일에
       -----
        ber
        beer
       ----
      가 있으면
      1행 읽으면 -> 레코드 'ber' 를 획득
  3. 패턴에 부합한지 확인
    • 부합하면 액션을 실행
    • 부합자지 않으면 아무것도 하지 않음
  4. 2행을 읽음 

필드변수  

awk : 특정 필드를 추출할 때 많이 사용

 

▶ awk의 필드 변수

# 전체 : $0
-rwxr-xr-x  1  root   wheel  100928  3   21   15:13   yes
#   $1      $2  $3     $4      $5   $6   $7    $8     $9
#                                     $(NF-2) $(NF-1) $NF

 

▶ ls 명령어 결과에서 5번째와 9번째의 필트 출력

$ ls -l /usr/bin | awk '{print $5, $9}'
171824 AssetCacheLocatorUtil
227584 AssetCacheManagerUtil

$ ls -l /usr/bin | awk '{print $5 $9}' # , 삭제되어서 두 필드가 붙어서 출력
171824AssetCacheLocatorUtil
227584AssetCacheManagerUtil
...

 

▶  레코드의 마지막 필드 출력 : $NF

$ ls -l /usr/bin | awk '{print $(NF-1), $NF}'
15:13 AssetCacheLocatorUtil
15:13 AssetCacheManagerUtil
...

 

패턴 지정  

▶  9 번째 필드가 cp 로 시작하는 것만 출력

awk '$9 ~ /^cp/ {print $5, $9}'

      ~         : 비교

     / ^cp /  : 정규표현식 cp

 

액션 생략

액션을 생략하면 단순히 레코드를 출력 → {print $0} 이 실행

▶  같은 결과가 나오는 코드

$ awk '$9 ~/^cp/'
$ awk '$9 ~/^cp/ {print}' 
$ awk '$9 ~/^cp/ {print $0}'

csv 파일 총합 과 평균

▶  총합

$ awk -F, '{sum += $NF} END {print sum}' score.csv
323

-F 는 필드 구분자를 셋팅하는 옵션 → -F, : , 을 필드 구분자로 설정

 

▶  평균

$ awk -F, '{sum += $NF} END {print "Average:",sum/NR}' score.csv
Average: 53.8333

+ Recent posts