3 |
awk 명령어 |
) -->
) -->
) -->awk는 제작자인 알프레드 아호(Alfred Aho), 브라이언 커니건(Brian Kernighan), 피터 웨인버거(Peter Weinberger) 등 세사람의 성의 첫 글자를 따서 만들어진 이름이다. awk 명령어는 자료 처리 및 리포트 생성에 사용하는 프로그래밍 언어로서 만들어 졌다.
) -->
awk 명령어는 구버전의 awk, 신버전의 awk(nawk 명령어), GNU awk(gawk 명령어), POSIX awk 등 다양한 버전이 존재한다. 최초의 1977년에 작성되었으며, 1985년에 큰 프로그램 처리를 위한 기능이 추가되었다. 당시 개선된 사항으로는 사용자 정의 함수, 동적 정규표현식, 다중 입력 파일의 처리등이 있다. 대부부의 시스템에서 awk를 실행하기 위해 쓰이는 명령어는 구버전의 사용을 원하는 경우 awk이고 새로운 버전의 경우 nawk이며 GNU 버전인 경우에는 gawk이다.
) -->
awk 명령어는 유닉스의 고급 명령어 중 한가지로 쉘 프로그램 작성시 알아 두면 프로그램을 편리하게 작성할 수 있는 명령어이다. 또한 awk 명령어만 가지고도 프로그램을 할 수 있는 기능을 제공하는 강력한 명령어이다. 이 교재에서는 awk 명령어의 일부 기능만을 설명하려고 한다. 다른 많은 기능에 관해서는 man 페이지나 또는 썬 공식 교재(쉘 프로그래밍)를 참고 하기 바란다. awk 명령어는 스크립트 작성시 유용하므로 반드시 매뉴얼 페이지를 참고해 주기 바란다.
awk내에 c언어의 모든 것을 다 사용할 수 있다.
) -->
awk 명령어의 기능을 요약하면 다음과 같다.
① Filters
② Numerical processing on rows and columns of data
③ Text processing to perform repetitive editing tasks
④ Report generation
) -->
(명령어 형식)
# awk 'statement' filename
) -->
statement is
① pattern
② {ACTION}
③ pattern {ACTION}
) -->
) -->
# ls -l
-rw-r--r-- 1 root other 0 11월 10 06:29 file1 ) --> <-----$1----> <-$2-> <-$3-> <--$4--> <-$5-> <-$6-> ..... <------------------------------------$0-----------------------------------> |
) -->
$1 ~ $9는 각 필드에 대한 구분이며 $0은 모든 필드를 의미한다.
) -->
) -->
실습을 위해 다음과 같이 일반 파일과 디렉토리 file1, file2 file3, dir01, dir02, dir03을 만들어 보자. 파일과 디렉토리의 목록을 testfile에 저장하고 awk 명령어를 사용하여 파일에 관한 필터링을 실습해 보자.
) -->
(실습을 위한 준비)
# cd /test
# touch file1 file2 file3
# mkdir dir01 dir02 dir03
# ls -l > testfile
) -->
[EX1] 기본 사용법
# awk '{ print $0 }' testfile /* testfile 파일의 모든 내용 출력 */
# awk '{ print $3 $5 $9 }' testfile /* 3,5,9번째 필드 출력, 필드간의 간격 없음 */
# awk '{ print $3, $5, $9 }' testfile /* 3,5,9번째 필드 출력, 필드간의 간격 1칸 */
# awk '{ print $3 " " $9 " " $6, $7 }' testfile /* 필드간의 간격을 직접 지정 */
# awk '{ print $3 "\t" $5 "\t" $9 }' testfile /* 필드간의 간격을 탭으로 지정 */
# awk '{ print $9, "is using", $5, "bytes" }' testfile
) -->
) -->
[EX2] statement 예제
# awk '/file/' testfile /* 파일에서 file 문자열 검색 */ grep명령의 찾을려는 것
# awk '/^-/' testfile /* 파일의 내용 중 라인의 처음에 -로 시작하는 내용 검색 */
# awk '{ print $1, $2, $3 }' testfile /* 1,2,3 번째 필드 출력, 필드간 간격 1칸 */
# awk '/file/ { print $1, $2 }' testfile /* 검색된 내용중 1,2번째 필드 출력 */
Using awk to Print Selected Fields
# awk '/^-/' testfile
-rw-r--r-- 1 root root 0 Nov 5 16:32 file1
-rw-r--r-- 1 root root 0 Nov 5 16:32 file2
-rw-r--r-- 1 root root 0 Nov 5 16:32 file3
-rw-r--r-- 1 root root 0 Nov 5 16:33 testfile
# grep ^- testfile
-rw-r--r-- 1 root root 0 Nov 5 16:32 file1
-rw-r--r-- 1 root root 0 Nov 5 16:32 file2
-rw-r--r-- 1 root root 0 Nov 5 16:32 file3
-rw-r--r-- 1 root root 0 Nov 5 16:33 testfile
문자 |
의 미 |
∖t |
Tab |
∖n |
Newline |
∖007 |
Bell |
∖011 |
Tab |
∖012 |
Newline |
∖042 |
" |
∖045 |
% |
) -->
) -->
[EX1] 포맷 문자 예제(Formatting Charaters Sample)
# awk '/file/ { print $1 "∖t" $2 }' testfile
# awk '/dir/ { print $1 "∖t" $2 "∖t" $3 }' testfile
# awk -F: '/root/ { print $1 "∖045" $2 }' /etc/passwd
) -->
) -->
) -->
(2). BEGIN * END - special patterns
) -->
# awk 'BEGIN { print "FILE LIST∖n" } /file/ { print $9 "∖t" $1 "∖t" $5 }' testfile
# awk 'BEGIN { print "FILE LIST START∖n" } ∖
> /file/ { print $5, $4 "∖n" } ∖
> END { print "FILE LIST STOP∖n" }' testfile
) -->
[많이 사용되는 awk 명령어 형식]
# awk -F: '$3 > 99 && $3 < 60000 { print $1 }' /etc/passwd (-F : Field Seperate)
) -->
위의 예제는 /etc/passwd 파일의 3번째 필드인 UID 번호가 99보다 크고 60000보다 작은 사용자들의 이름을 출력하는 예제이다. 일반 사용자의 이름을 알수 있는 것은 솔라리스 시스템에서 중요한 의미를 가진다. 예를 들어 /etc/ftpd/ftpusers 파일의 마지막 부분에 사용자들을 추가하여 FTP 접속을 차단할수도 있다.
) -->
[EX] awk 명령어의 사용예
# df -k /export/home | tail -1 | awk '{print $5}' /* 파티션 사용량(%)를 구하는 예 */
=> export/home의 마지막1줄을 출력하고 5번째 필드를 출력하는 방법
# ps -elf | awk '$2 == "Z" {print $0}' /* 좀비 프로세스를 검색하는 예 */
=> ps -elf에서 2번째 필드가 Z인것의 모든 필드를 출력
) -->
[EX] awk 명령어의 다른예
/etc/vfstab 파일에 새로운 내용을 추가하고 싶다.
- /etc/vfstab 파일
- /etc/syslog.conf 파일
) -->
# cat file1.txt
/dev/dsk/c1t0d0s7 /dev/rdsk/c1t0d0s7 /export/home ufs 2 yes -
) -->
# awk '{print $1 "\t" $2 "\t" $3 "\t" .... }' file1.txt >> /tmp/.tmp1
# mv /tmp/.tmp1 /etc/vfstab
) -->
) -->
) -->
) -->
(3). Programming with awk
) -->
# vi pro.awk
BEGIN { print "START" } /file/ { print $5, $4 } END { print "STOP" } |
) -->
# awk -f pro.awk testfile
-> 출력 내용 생략
) -->
# vi pro.awk
BEGIN { print "=================================" } /file/ { print $5, $4 } END { print "==================================" } |
) -->
# awk -f pro.awk testfile
-> 출력 내용 생략
awk 명령어
# awk '{ print $0 }' testfile
# awk '{ print $3 $5 $9 }' testfile
# awk '{ print $3 " " $9 " " $6, $7 }' testfile
# awk '{ print $3 "\t" $5 "\t" $9 }' testfile
# awk '{ print $9, "is using", $5, "bytes" }' testfile
) -->
# awk '/file/' testfile
# awk '{ print $1, $2, $3 }' testfile
# awk '/file/ { print $1, $2 }' testfile
) -->
# awk -F: '$3 > 499 && $3 < 60000 {print $1}' /etc/passwd
# df -h / | tail -1 | awk '{print $6}'
# ifconfig eth0 | grep inet | grep -v inet6 | \
awk '{print $2}' | awk -F: '{print $2}'
#ifconfig eth0 | grep inet | awk '{print $2}'| awk -F: '{print $2}'
결과값=>172.16.1.203
# ps -elf | awk '$2 == "Z" {print $0}'
'Learning > └◆Shell Scripts' 카테고리의 다른 글
[Shell Scripting] 본(Born) 쉘 특징 (0) | 2016.12.12 |
---|---|
[Shell Scripting] 유닉스 명령어(4) 기타 명령어 (0) | 2016.12.12 |
[Shell Scripting] 유닉스 명령어(2) sed CMD (0) | 2016.12.12 |
[ShellScripting] 유닉스 명령어(1) grep CMD (0) | 2016.12.12 |