티스토리 뷰

프로그램

awk 명령어

CHOMAN 2015. 6. 8. 16:49

구조 : awk '패턴 {action}' "파일이름"

 

패턴

 

BEGIN : 특정 명령을 실행하기 전에 먼저 실행시킨다
END : 특정 명령을 실행한후 제시되는 문장을 실행시킨다

/정규표현식/ : 정규표현식의 패턴을 포함하는 라인에서 문장을 실행시킨다

패턴1 && 패턴2 : 패턴1과 패턴2를 동시에 만족시킬때 문장을 실행시킨다
패턴1 || 패턴2 : 패턴 1이나 패턴2중 하나만 만족시켜도 문장 실행시킨다
! 패턴 : 패턴과 일치하지 않을 경우 문장을 실행시킨다

 

 

연산자

 

산술연산자


+ 더하기
- 빼기
* 곱하기
/ 나누기
A % B A를 B로 나눈 나머지값
++ 어떤값에서 1을 증가
-- 어떤값에서 1을 감소


대입연산자

A = B A = B
A += B A = A + B
A -= B A = A - B
A *= B A = A*B
A /= B A = A/B
A %= B A = A%B


논리연산자

|| or
&& and


비교연산자

! not
> 크다
< 작다
>= 크거나 같다
<= 작거나 같다
== 같다
!= 다르다

 

 

awk 내부 변수 (미리 지정되어 있는 변수)

 

FILENAME 현재 처리되고 있는 파일이름

FS 필드 구분자
RS 레코드 구분자

NF 현재 레코드에서 필드수
NR 현재 파일에서 전제 레코드 수

OFS 출력시의 필드 구분자
ORS 출력시의 레코드 구분자

 

 

예제

 

awk '{print $1,$3}' 파일이름
- 1, 3번 필드를 출력하라

$0 전체필드를 의미함, 출력할때 $0 을 쓰면 그냥 cat 명령어를 실행한것과 동일한 기능이다

awk '$2 > 20 {print $1,$2}' 파일이름
- 2번째 필드값이 20보다 큰 레코드 중에 1, 2번째 필드를 출력하라

sed 's/nom / /g' 파일이름 | awk '$2 > 25 {print $1,$2}' 파일이름
- nom을 공백으로 바꾸고 2번째 필드값이 25이상인 레코드 중에서 1, 2번 필드를 출력하라

sed 's/nom / /g' 파일이름 | awk '$2 > 25 {print $1"문자1",$2"문자2"}' 파일이름
- 위의 출력값에 필드1과 필드2에 특정 문자를 꼽사리 끼워서 좀 꾸며서 출력할수도 있음

sed -f 문법넣은파일1 파일이름 | awk -f 문법넣은파일이름2
- -f 가 파일로 실행하는 명령인거 같음
- 편집기로 문법넣은파일을 생성하면 되는듯 함 ' '는 안 써주는듯 커맨드로 날릴때 써주는거 ' '

 


 


ls -al | awk '$5 > 1048576{print $5, $9}'

 : ls -al 명령어를 통해 출력된 값 중에 필드 5번째값이 1M 이상이면 해당 라인의 5번째 필드와 9번째 필드를 출력하라


awk /root/ /etc/group

 : /etc/group 파일의 root 라는 문자열이 포함된 라인을 출력


awk -F: /root/'{print $1}'  /etc/passwd

 : -F 구분자는 필드를 원래 공백으로 구분짓지만 -F 바로 나오는 문자열로 필드를 구분


awk 프로그래밍

 

BEGIN {

sum = 0;
line = 0;
}

{
sum += $2;
line ++;
}

END {
average = sum / line;

printf "나이의 평균 : "average"세";
}

 

awk {}
BEGIN 과 END 를 이용하여 변수의 선언을 비롯한 초기화

ps -ef | grep httpd
ps -ef | awk '/httpd/ {print}'
ps -ef | awk '/httpd/ {print $0}'
- $0 은 입력라인 전체를 의미

UID PID PPID C STIME TTY TIME CMD
$1 $2 $3 $4 $5 $6 $7 $8

UID와 C만 출력하고 싶다면
- ps -ef | awk '/httpd/ {print $1, $4}'

UID, PID, C 필드를 출력하고 처리 끝나고 마지막에 C (CPU 사용시간) 의 합을 출력
- ps -ef | awk '/httpd/ {print $1, $2, $4; sum += $4} END {print "sum = ", sum}'

CPU 사용시간이 1이상인 프로세스들을 출력하고 그 합을 출력
- ps -ef | awk '/httpd/ {if ($4 >= 1) print $1, $2, $4; sum += $4} END {print "sum = ", sum}'

grep

test.txt 파일에서 시작문자가 "C" 마지막문자가 "3" 으로 끝나는 문자열을 포함하고 있는 문장 검색
- grep "^c.*3$" test.txt

test.txt 파일에서 grep 명령어를 사용하여 "1" 을 포함하고 있는 모든 문장검색
- cat test.txt | grep "1"

cat test.txt | awk '/신규/ {print $6}'
- test.txt 파일에서 신규를 포함한 6번째 문장만 출력


awk 스크립트


Begin : 시작단계 (전체 스크립트를 위한 정의) 변수 정의 등등...

Routin : 실행단계 (스크립트 기능 실현 하는 단계)

End : 마무리 단계 (결과 출력)


awk 스크립트 예제


#!/bin/awk
BEGIN{
word = 0;
}
{
word += NF;
}
END{
print "Word Count:"
word;(End)
}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함