6가지 awk 트릭

참조 원문 : 6 Tricks with awk
관련 글 : awk 기초, awk를 이용한 검색, awk에서 변수 사용

  AWK는 텍스트 기반의 데이터(파일이나 데이터 스트림)를 처리하기 위한 프로그래밍 언어입니다. 주로 문자열 데이터타입, 배열, 정규 표현식을 사용합니다.

  AWK는 본 쉘과 더불어 표준 유닉스 환경에서 사용할 수 있는 스크립트 언어이며 LSB(Linux Standard Base) 사양서에 반듯이 있어야 하는 것으로 규정된 명령어 중 하나입니다.

  비록 AWK가 1줄 프로그래밍을 지원하고 또 대부분 그렇게 사용되지만 하나의 완벽한 프로그램을 짜는 것도 가능합니다.


1. 파일에서 정렬 없이 중복 내용 삭제
  정렬을 하지 않고도 중복된 내용을 찾아 지우고 다른 파일로 리다이렉트하는 방법입니다.

awk ‘!x[$0]++’

  그리고 아래는 그 예와 결과입니다.

$ echo -e “aaa\nbbb\naaa\naa\nccc\naa”|awk \!’x[$0]++’
aaa
bbb
aa
ccc


2. 특정 파일 그룹의 총 용량 합산
  아래는 디렉토리 내에 모든 파일의 크기를 합산하는 방법입니다.

ls -l | awk ‘{s = s+$5 }; END { print s }’

  그리고 아래는 현재 디렉토리와 서브디렉토리 내에 있는 .mp3 파일들의 용량을 합산하는 방법입니다.

ls -lR |grep .mp3 | awk ‘{s = s+$5 }; END { print s }’


3. find 명령어와 연계
  아래는 find로 컴퓨터 내의 모든 .mp3 파일들을 찾아 위에서 본 것과 비슷한 방식으로 용량을 합산하는 방법입니다.

find / -name “*.mp3” -exec ls -l {} \; | awk ‘{s = s+$5 }; END { print s }’


4. 사용횟수로 기준으로 내림차순으로 정렬하여 히스토리 출력

history | awk ‘{a[$’`echo “1 2 $HISTTIMEFORMAT” | wc -w`’]++}END{for(i in a){print a[i] “\t” i}}’ | sort -rn | head


5. AWK 필드 분석
  각 줄마다 번호를 매기고 다시 각 줄의 아래에 해당 줄에 있는 필드마다 번호를 매겨 출력합니다.

awk ‘{print NR”: “$0; for(i=1;i<=NF;++i)print “\t”i”: “$i}’


6. 여러 파일의 파일명을 한 번에 변경
  아래는 특정 파일들의 파일명 끝에 ‘.new’를 붙이는 방법입니다. 앞 부분의 ‘ls -al pattern’을 변경하여 다양한 활용이 가능합니다.

ls -1 pattern | awk ‘{print “mv “$1” “$1″.new”}’ | sh