awk
데이터 조작 및 보고서 생성에 사용되는 유닉스 프로그래밍 언어
1. awk 형식
- 파일 입력
. awk 'pattern' filename
. awk '{action}' filename
. awk 'pattern {action}' filename
. 예제
- awk '/Mary/' employee
- awk '{print $1}' employee
- awk '/Sally/{print $1, $2}' employee
. 구분자는 공백
- 명령으로 입력
. command | awk 'pattern'
. commnad | awk '{action}'
. command | awk 'pattern {action}'
. 예제
- df | awk '$4 > 75000'
- rusers | awk '/root$/{print $1}'
2. 출력 형식 지정
- print 함수
. awk는 일치된 줄을 출력하는 기본 동작을 수행
. 변수, 계산 결과값이나 문자 상수를 매개변수로 받음
. 문자열은 큰 따옴표로 묶고, 콤마는 매개변수를 분리하는데 사용
. 콤마를 쓰지 않으면, 매개변수는 하나로 인식하고, 콤마는 출력 필드 구분자로 사용되며, 기본값은 공백
. date | awk '{print "Month: " $2 " \nYear: ", $1}'
. Escape Sequences(이스케이프 시퀀스)
- 역슬래시(\)와 영문자 숫자로 표현
이스케이프 시퀀스 |
의미 |
\b |
백스페이스 |
\f |
폼피드 (form feed) |
\n |
개행문자 |
\r |
캐리지 리턴 (Carriage return) |
\t |
탭 |
\047 |
8진수 47, 작은 따옴표 |
\c |
c는 다른 문자를 의미 예를 들어 \ |
- awk '/Sally/{print "\t\tHave a nice day, " $1, $2 "!"}' employees
- OFMT 변수
. 숫자에 서식을 지정해서 출력해야 할 경우
. awk 'BEGIN{OFMT="%.2f"; print 1.245678, 12E-2}'
- printf 함수
. 표준 출력으로 형식화된 문장을 되돌려 줌
. 개행문자가 필요하면 반드시 이스케이프 시퀀스로 지정
. echo "UNIX" | awk '{printf "|%-15s|\n", $1}'
. echo "UNIX" | awk '{printf "|%15s|\n", $1}'
. awk '{printf "The name is: %-15s ID is %8d\n", $1, $2}' employees
. printf 변환 문자
문자 |
설명 |
c |
문자 |
s |
문자열 |
d |
10진수 |
ld |
long형 10진수 |
u |
부호없는 10진수 |
lu |
long형 부호없는 10진수 |
x |
16진수 |
lx |
long형 16진수 |
o |
8진수 |
lo |
long형 8진수 |
e |
부동소수점 숫자. 과학적 표기법(e-) |
f |
부동소수점 숫자 |
g |
부동소수점 숫자. e나 f변환 중 적은 자리수를 차지 하는 표기법 사용 |
. printf 수식어
문자 |
설명 |
- |
왼쪽정렬 수식어 |
# |
0으로 시작하는 8진법 형식의 정수를 표시 16진법 형식의 정수는 0x로 시작하여 표기 |
+ |
d,e,f,g를 이용하여 변환할때, 숫자를 부호 +,- 함께 출력 |
0 |
화이트 스페이스 대신 0으로 값을 채워 출력 |
. printf 형식 지정자
형식지정자 |
동작 |
x='A', y=15, z=2.3, $1=Bob Smith 할당 | |
%c |
단일 ASCII문자 출력 printf("The character is %c.\n",x) -> The character is A. |
%d |
10진수 출력 printf("The boy is %d years old.\n",y) -> The boy is 15 years old. |
%e |
숫자를 e표기법으로 출력 printf("z is %e.\n",z) ->z is 2.3e+01. |
%f |
부동소수점 숫자 출력 printf("z is %f.\n",2.3*2) ->z is 4.600000. |
%o |
8진수 출력 printf("y is %o.\n",y) -> y is 17. |
%s |
문자 출력 printf("The name of the culprit is %s.\n",$1) -> The name of the culprit is Bob smith. |
%x |
16진수 출력 printf("y is %x.\n",y) -> y is f. |
3. 파일에서 awk 명령 사용
- awk -f awkfile emplyees
4. 레코드와 필드
- 레코드
. 레코드 구분자
- 입출력시 레코드를 구분해 주는 구분자(행 구분자)는 기본적으로 캐리지 리턴(CR)
. $0 변수
- 전체 레코드를 참조
- awk '{print $0}' employees
. NR 변수
- 각 레코드 번호는 awk 내장 변수인 NR에 저장. 레코드 처리가 끝난 후 NR값이 하나 증가
- awk '{print NR, $0}' employees
- 필드
. 각 레코드는 기본적으로 화이트스페이스(공백, 탭)로 구분된 필드라는 단어들로 구성
. awk '{print NR, $1, $2, $5}' employees
. awk '{print NF, $0}' employees
. 필드 구분자
- 입력 필드 구분자
. FS에는 입력 필드 구분자가 지정. 기본값은 스페이스, 탭
. 명령줄에서 FS값을 변경하는 경우 -F 옵션과 함께 새로운 구분자를 지ㅓㅇ
- awk -F: '/Tom Jones/{print $1, $2}' employees2
. 두 개 이상의 입력 필드 구분자를 지정할 경우 대괄호([])에 표기
- awk -F'[ :\t]' '{print $1, $2, $3}' employees2
. 스페이스, 콜론(:), 탭
- 출력 필드 구분자
. 기본값은 스페이스이며, OFS 내장변수에 지정
. print 문에서 각 필드를 구분하기 위해 사용한 콤마(,)는 무조건 OFS로 취급
- awk -F: '/Tom Jones/{print $1, $2, $3, $4}' employees2
- awk -F: '/Tom Jones/{print $0}' employees2
5. 패턴과 동작
- 패턴
. awk 패턴은 입력 줄을 awk가 어떻게 동작을 할 것인지를 제어
. 기본 동작은 표현식의 결과가 참인 줄을 출력
. awk '/Tom/' employees
. awk '$3<4000' employess
- 동작
. 동작은 중괄호({})로 묵여 있으며, 세미콜론(;)으로 구분된 문장
. {action}
. {print $1, $2}
. pattern{action statement; action statement; etc.}
. pattern{
action statement
action statement
}
. awk '/Tom/{print "Hello there, "$1}' employees
- 동작이 없는 패턴은 패턴과 일치하는 모든 줄을 출력
6. 정규표현식
- awk에서의 정규표현식은 슬래시(\) 사이에 오는 문자들로 구성된 패턴
- 정규표현식 메타문자의 사용을 허용
- 정규표현식 메타문자
메타문자 |
의미 |
^ |
행의 시작 지시자 |
$ |
행의 끝 지시자 |
. |
하나의 문자와 대응 |
* |
선행문자와 같은 문자의 0개 혹은 염의 개수와 대응 |
? |
선행문자와 같은 문자 |
[ABC] |
[]사이의 문자 집합 중 하나와 대응. A or B or C |
[^ABC] |
[]사이의 문자 집합에 속하지 않는 한 문자와 대응 |
[A-Z] |
A-Z 문자 집합 중 하나와 대응 |
A|B |
A나 B와 대응 |
(AB)+ |
하나 이상의 문자셋 AB와 대응. AB, ABAB, ABABAB |
\* |
문자로서의 *와 대응 |
& |
검색열을 저장하여 지환열에서 사용할 수 있게 함 |
- 전체 줄에서의 일치
. 단일 정규표현식은 전체 줄의 패턴에 대한 일치 여부를 점검
. 모든 줄이 일치되는 것으로 간주되어 출력
. awk '/^Mary/' employees
. awk '/^[A-z][a-z]+ /' employees
- 대문자로 시작하고, 하나 이상의 소문자가 오며, 이어서 스페이스가 오는 줄을 표시
- match 연산자(~, tilde)
. 특정 레코드나 필드 내에서 일치하는 정규표현식 패턴이 존재하는지 검사
. awk '$1~/[Bb]ill/' employees
. awk '$1!~/ly$/' employees
- 첫번째 필드가 ly로 끝ㄴ지 않는 행들을 출력
. POSIX 문자 항목
- the Porable Operating System Interface는 프로그램들이 운영체제간의 상호 호환이 가능하도록 보증하는 산업표준
- POSIX로 추가된 대괄호 문자 클래스
대괄호 |
클래스 의미 |
[:alnum:] |
알파벳과 숫자 문자 |
[:alpha:] |
알파벳 문자 |
[:cntrl:] |
제어 문자 |
[:digit:] |
숫자 문자 |
[:graph:] |
공백이 아닌 문자(스페이스,제어문자등이 아닌 문자) |
[:lower:] |
소문자 |
[:print:] |
[:graph:]와 유사하지만 공백을 포함 |
[:punct:] |
구두점 |
[:space:] |
모든 공백문자(개행,스페이스,탭) |
[:upper:] |
대문자 |
[:xdigit:] |
16진수(0-9a-fA-F) |
. awk '/[[:lower:]]+g[[:space:]]+[[:digit:]]/' employees
- 하나 이상의 소문자와 이어서 g, 하나이상의 스페이스, 숫자가 오는 패턴 검사
7. 스크립트 파일 안의 awk 명령
- awk -F: -f info employees2
8. 리뷰
- 간단한 패턴 매칭
. awk '/west/' datafile
. awk '/^north/' datafile
. awk '/(no|so)/' datafile
- 간단한 동작
. awk '{print $3, $2}' datafile
. awk '{print $3 $2}' datafile
. awk '{print $0}' datafile
. awk '{print "Number of fields: "NF}' datafile
- 패턴과 동작이 조합된 정규 표현
. awk '/northeast/{print $3, $2}' datafile
. awk '/E/' datafile
. awk '/^[ns]/{print $1}' datafile
. awk '$5~/\.[7-9]+/' datafile
. awk '$2!~/E/{print $1, $2}; datafile
. awk '$3~/^Joel/{print $3 " is a nice guy."}' datafile
. awk '$8~/[0-9][0-9]$/{print $8}' datafile
. awk '$4!/Chin$/{print "The price is $" $8 "."}' datafile
. awk '/TJ/{print $0}' datafile
- 입력 필드 구분자
. awk '{print $1}' datafile2
. awk -F: '{print $1}' datafile2
. awk '{print "Number of fields: "NF}' datafile2
. awk -F: '{print "Number of fields: "NF}' datafile2
. awk -F"[ :]" '{print $1, $2}' datafile2
9. 비교식
- 관계 연산자
. 값이 1이면 참, 0이면 거짓
연산자 |
의미 |
예제 |
< |
작은 |
x<y |
<= |
작거나 같은 |
x<=y |
== |
같은 |
x==y |
!= |
같지 않은 |
x!=y |
>= |
크거나 같은 |
x>=y |
> |
큰 |
x>y |
~ |
정규 표현식과 같은 |
x~/y/ |
!~ |
정규 표현식과 같지 않은 |
x!~/y/ |
. awk '$3==5346' employees
. awk '$3>5000{print $1}' employees
. awk '$2~/Adam/' employees
. awk '$2!~/Adam/' employees
- 조건식
. 물음표(?), 콜론(:) 기호 두 개를 사용하여 식을 평가
. 조건식1?구문2:구문3
. awk '{max=($1>$2)?$1:$2;print max}' filename
if($1>$2)
max=$1
else
max=$2
- 산술계산
. 산술계산은 패턴 안에서 이루어진다. 모든 산술계산은 부동소수점으로 변환한 후 처리
연산자 |
의미 |
예제 |
+ |
더하기 |
x+y |
- |
빼기 |
x-y |
* |
곱하기 |
x*y |
/ |
나누기 |
x/y |
% |
나머지 |
x%y |
^ |
지수 |
x^y |
. awk '$3*$4>500' filename
- 논리 연산과 결합 패턴
연산자 |
의미 |
예제 |
&& |
논리 AND |
a&&b |
|| |
논리 OR |
a||b |
! |
NOT |
!a |
. awk '$2>5 && $2<=15' filename
. awk '$3==100 || $4>50' filename
. awk '!($2<100 && $3<20) filename
- 범위 패턴
. 첫번째 패턴부터 두번째 패턴까지 선택
. awk '/Tom/,/Suzanne/' filename
- 데이터 검증 프로그램
. 패스워드 검사 포스트 참고
10. 리뷰
- 동일성 검사
. awk '$7==5' datafile
. awk '$2=="CT" {print $1, $2}' datafile
. awk '$7!=5' datafile
- 관계 연산자
. awk '$7<5 {print $4, $7}' datafile
. awk '$6>.9 {print $1, $6}' datafile
. awk '$8<=17 {print $8}' datafile
. awk '$8>=17 {print $8}' datafile
- 논리 연산자
. awk '$8>10 && &8<17' datafile
. awk '$2=="NW" || $1~/south/{print $1, $2}' datafile
- 논리 NOT 연산자(!)
. awk '!($8==13) {print $8}' datafile
- 산술 연산자
. awk '/southern/ {print $5+10}' datafile
. awk '/southern/ {print $8-10}' datafile
. awk '/southern/ {print $8/2}' datafile
. awk '/southern/ {print $8*10}' datafile
. awk '/southern/ {print $8%3}' datafile
. awk '$3~/^Susan/ {print "Percentage: "$6+.2 " Volume: "$8}' datafile
- 범위 연산자
. awk '/^western/,/^eastern/' datafile
- 조건 연산자
. awk '{print ($7>4 ? "high "$7 : "low "$7)}' datafile
- 대입 연산자
. awk '$3=="Chris"{$3="Christing;print}' datafile
. awk '/Derek/{$8 += 12; print $8}' datafile
. awk '{$7 %= 3; print $7}' datafile
http://blog.naver.com/illi0001?Redirect=Log&logNo=140111224551
'linux' 카테고리의 다른 글
find 명령어 위주 쉘명령어 (0) | 2011.09.20 |
---|