'Linux/awk'에 해당되는 글 4건

  1. 2013.04.21 match 연산자
  2. 2013.04.21 필드 분리자, 액션, 정규표현식, 메타문자
  3. 2013.04.21 awk 동작원리, print, printf, OFMT 변수
  4. 2013.04.21 awk programming

match 연산자

Linux/awk 2013. 4. 21. 12:30 |


match 연산자

틸드 (~) 로 표기되는 match 연산자는 하나의 레코드 또는 필드 안에서 표현식과 매칭되는 것이 있는지 검사하는 연산자이다.



1) 위의 첫번째는 2번 필드에 대문자 Kil 또는 kil 과 매칭되는 것이 있는지 검색하고 검색된 결과가 있다면, 검색된 라인을 출력한다.

2) 두번째는 2번 필드가 g로 끝나지 않는 라인을 검색하고 출력한다.



POSIX 문자 클래스

POSIX 문자

 [:alnum:]

 [A-Za-z0-9] 알파벳 문자와 숫자로 이루어진 문자열

 [:alpha:]

[A-Za-z] 알파벳 문자 

 [:blank:]

[ /x09] 스페이스와 탭 

 [:digit:]

[0-9] 숫자 

 [:graph:]

[!-~] 공백이 아닌 문자 (스페이스, 제어 문자들을 제외한 문자) 

 [:lower:]

[a-z] 소문자 

 [:print:]

[-~] [:graph:] 와 유사하지만 스페이스 문자를 포함 

 [:punct:]

[!-/:-@[-{-~] 문장 부호 문자 

 [:space:]

[ \t\v\f] 모든 공백 문자(newline 줄바꿈, 스페이스, 탭) 

 [:cntrl:]

컨트롤 제어 문자 

 [:upper:]

[A-Z] 대문자 

 [:xdigit:]

[0-9a-fA-F] 16진수에서 사용할 수 있는 숫자 


awk '/[[:lower:]]+g[[:space:]]+[[:digit:]]/' awkfile2

-> 위의 명령은 하나 이상의 소문자를 검색한 다음, g가 나오고 다음으로 하나 이상의 공백이 나오고, 이어서 숫자가 나오는 라인을 검색하는 명령이다.


'Linux > awk' 카테고리의 다른 글

필드 분리자, 액션, 정규표현식, 메타문자  (0) 2013.04.21
awk 동작원리, print, printf, OFMT 변수  (0) 2013.04.21
awk programming  (0) 2013.04.21
Posted by scii
:


필드 분리자 (Field Separator)

입력 필드 분리자 (FS)

awk의 빌트인 변수 FS는 입력 필드 분리자의 값을 가지고 있다. 

FS의 디폴트 값으로 공백과 탭이 사용되고 이 값으로 입력 필드가 분리된다. 

FS의 값은 BEGIN 문장 또는 명령라인에서 새로운 값으로 변경될 수 있다. 

명령라인에서 FS 값을 변경하기 위해서는 -F 옵션을 사용해야 한다. 이때 -F 다음에 적어주는 문자가 새로운 필드 분리자가 된다.


필드 분리자를 여러 개 지정할 수도 있다.

-F 옵션은 브라켓([ ]) 안에서 정규표현식을 사용할 수 있는데, 아래의 예제에서 공백이나, 콜론(:), 탭을 만나면 이 문자를 필드 분리자로 인식한다. 

작은 따옴표는 쉘의 메타문자로 인식하지 않도록 하기 위함이다.





액션

pattern {action statment; action statment; etc.}

or

pattern

{

action statement

action statement

}


awk에서 액션은 컬리 블레이스로 둘러싸인 문장이며 세미콜론(:)으로 구분된다.

패턴은 애션 앞에 오며, 액션은 간단한 문장 또는 복잡한 문장들의 그룹으로 만둘 수 있다. 

문장들은 세미콜론 또는 newline에 의해 분리된다.

{print $1, $2}

 패턴은 첫 번째 열기 컬리 브레이스 ({) 부터 첫 번째 닫기 컬리 브레이스(}) 까지의 액션을 관리한다.

만약 패턴 뒤에 액션이 올 때, 첫 번째 열기 컬리 브레이스는 패턴과 같은 라인에 있어야 한다.

문자열 매칭 패턴은 슬래시(/) 로 둘러싸인 정규표현식을 포함한다.



awk와 정규표현식

awk에서 정규표현식은 슬래시(/)로 둘러싸인 문자들로 구성된 패턴이다. 

awk는 정규표현식을 수정할 수 있는 정규표현식 메티문자(egrep와 같음) 사용을 지원한다.



아래의 awk 명령은 대문자로 시작하고, 두 번째 문자부터 소문자를 하나 이상 포함하고 있으며, 그 뒤로 공백이 있는 라인을 출력하라는 의미이다.


awk에서 지원하는 메타문자


 awk 메타문자

의미 

문자열의 시작과 매칭 

문자열의 끝과 매칭 

문자 한 개와 매칭 

문자가 없거나 그 이상과 매칭 

하나의 문자 또는 그 이상과 매칭 

문자가 없거나 하나와 매칭 

[ABC] 

A, B, C 문자셋 중 하나의 문자만 매칭 

[^ABC] 

A, B, C 문자셋 중 매칭되는 문자가 하나도 없음 

[A-Z] 

A에서 Z까지의 범위에서 매칭되는 문자가 있음 

A|B 

A 또는 B 문자 매칭 

(AB)+

AB 문자셋이 하나 이상 매칭. 예) AB, ABAB, ABABAB 

검색 문자열에서 검색된 문자열로 대체할 때 사용 



awk에서 지원하지 않는 메타문자    

 메타문자

의미 

\< >/ 

단어 

\( \) 

후위 참조 

\{ \} 

반복 



'Linux > awk' 카테고리의 다른 글

match 연산자  (0) 2013.04.21
awk 동작원리, print, printf, OFMT 변수  (0) 2013.04.21
awk programming  (0) 2013.04.21
Posted by scii
:


awk 동작 원리



1) 먼저 awk는 파일 또는 파이프를 통해 입력 라인을 얻어와서 $0 이라는 내부 변수에 라인을 입력해 둔다. 각 라인은 레코드라고 부르는데, 기본적으로 newline에 의해 구분된다.

2) 다음으로 라인은 공백을 기준으로 각각의 필드나 단어로 나누어진다. 각 필드는 번호가 매겨진 변수로 저장되고 $1 부터 시작한다. 많게는 100개 이상의 필드를 저장할 수 도 있다. 

3) awk가 어떻게 공백을 사용하여 필드를 나눌까? 내장 변수인 FS라고 부르는 필드 분리자가 있는데, 이 FS는 가장 먼저 공백(탭)을 할당받는다. 만약 필드가 콜론(:) 이나 대시(-) 와 같은 다른 문자에 의해 분리된다면 새로운 필드 분리자로 FS의 값을 변경할 수 있다.

4) awk는 화면에 필드를 출력할 때 print 함수를 사용한다.

위의 결과값으로 CentOS와 100사이에 공백이 들어가 있음을 확인할 수 있다. 왜냐하면 명령에서 콤마(.)가 들어가 있기 때문이다. 콤마는 출력필드 분리자(OFS) 라는 내장 변수와 매핑되어 있다. 이 OFS는 기본값으로 공백을 할당받는다. 그래서 콤마는 OFS 변수에 할당된 공백 문자를 만들게 되는 것이다.

5) awk가 화면에 출력을 하고 나면 파일의 다음 라인이 호출되고 $0으로 저장된다. 이때 앞에서 변수 $0에 저장되었던 라인은 덮어쓰기가 된다. 또 다시 공백을 기준으로 필드가 분리되고 처리가 진행된다. 이와 같은 프로세스는 파일의 모든 라인이 처리되기 전까지 계속 반복된다.



print 함수

awk 명령의 액션 파트는 중괄호({})로 묶어준다. 만약 액션이 지정되지 않고 패턴이 매칭된다면 awk는 매칭된 라인을 모니터에 출력하는 기본 액션을 수행한다.

print함수는 포매팅이 필요없이 간단히 출력하는데 사용된다. 좀더 복잡한 포매팅을 원한다면 printf, fprintf, sprintf 함수를 사용하도록 한다. 


print 함수는 {print} 형식으로 awk의 액션 부분에 사용될 수 있다. 

print 함수는 아규먼트로 변수와 계산된 값 또는 문자열 상수를 받는다. 문자열은 큰 따옴표("")로 둘어싸야 한다. 

콤마(,)는 아규먼트들을 분리하는데 사용된다. 만약 콤마를 사용하지 않으면 아규먼뜰은 서로 연결되어버린다. 콤마는 기본값으로 공백을 가지는 OFS의 값을 검사한다.


print 함수의 이스케이프 문자

\b        백스페이스   

\f        폼피드

\n        newline 

\r        캐리지 리턴

\t        탭

\047        8진수 47

\c        c는 문자를 대표한다.



OFMT 변수

숫자를 출력할 때 숫자의 포맷을 제어해야 할 경우가 있다. 간단히 printf 함수를 사용하면 되지만, OFMT(Output Format) 변수를 사용할 수도 있다. 

OFMT 변수는 print 함수를 사용할 때 숫자의 출력 포맷을 제어할 수 있다. 기본 포맷으로 %.6g 가 설정된다. 이 포맷은 최대 전체 6자리를 가지는데, "0." 으로 시작하면 소수점 아래 6자리를 출력하고, "0."이 아닌 수로 시작하면 전체 6자리를 출력한다. 그리고 소수점 아래에 위치하는 마지막 6번째 수는 7번째 자릿수에서 반올림한다. 만약 대상의 수가 6자리를 넘지 않으면 그대로 출력한다.





printf 함수

출력할 때 필드 사이에 공백들을 지정하고 싶을 경우가 있다. 탭키를 사용한 print 함수는 깔끔한 출력을 보장하지 못한다. 하지만,

printf 함수는 포매팅된 깔끔한 출력을 제공한다. 

printf 함수는 C언어의 printf 문장처럼 표준 출력으로 포매팅된 문자열을 리턴한다. printf 문장은 포맷 지시자와 변경자 등의 제어 문자열을 가지고 있다. 제어 문자열은 콤마와 콤마로 분리된 표현식의 목록을 따른다.


'Linux > awk' 카테고리의 다른 글

match 연산자  (0) 2013.04.21
필드 분리자, 액션, 정규표현식, 메타문자  (0) 2013.04.21
awk programming  (0) 2013.04.21
Posted by scii
:

awk programming

Linux/awk 2013. 4. 21. 12:01 |


awk

Bash Shell 에서 필수적인 툴이다.


awk는 데이터를 조작하고 리포트를 생성하기 위해 사용하는 언어이다. 리눅스에서 사용하는 awk는 GNU 버전의 gawk 로 심볼릭 링크되어 있다.


awk에서는 간단한 연산자를 명령라인에서 사용할 수 있으며, 큰 프로그램을 위하여 사용될 수 있다. 

awk는 데이터를 조작할 수 있기 때문에 쉘 스크립트에서 사용되는 필수 툴이며, 작은 데이터베이스를 관하기 위해서도 필수이다.


※ awk 명령에서 END 블록을 사용할 경우에는 반드시 아규먼트 파일명을 적어주어야 한다. BEGIN 블록만 사용할 경우에는 아규먼트 파일명을 적지 않아도 동작한다.



awk Programming 

awk 프로그래밍은 awk 명령어를 입력한 다음, 작은 따옴표로 둘러싸인 패턴이나 액션을 입력하고 마지막으로 입력 파일을 입력한다. 만약 입력 파일을 지정하지 않으면 키보드 입력에 의한 표준 입력(stdin)으로부터 입력을 받게 된다. 

그리고 awk는 입력된 라인들의 데이터들을 공백 또는 탭을 기주능로 분리하여 $1부터 시작하는 각각의 필드 변수로 분리하여 인식한다.


파일로부터의 입력

awk 'pattern' filename

awk '{action}' filename

awk 'pattern {action}' filename






명령어로부터의 입력

명령어로부터 입력으 받기 위해서 '|' 파이프를 사용할 수 있다.

command | awk 'pattern'

command | awk '{action}'

command | awk 'pattern {action}'



df 명령어는 하드 디스크 용량 상황을 볼 수 있는 명령인데, df 명령의 결과를 보면 네 번째 필드에 사용할 수 있는 용량이 1kbyte block 단위로 표시된다. 네 번째 필드의 값이 10000000 보다 큰 라인을 출력하기 위해 df | awk '$4 > 10000000' 명령을 실행했기 때문에 위와 같이 결과가 출력된다. 

이와 같이 분리자를 지정하지 않은 경우에는 기본 분리자로 공백을 사용한다.


'Linux > awk' 카테고리의 다른 글

match 연산자  (0) 2013.04.21
필드 분리자, 액션, 정규표현식, 메타문자  (0) 2013.04.21
awk 동작원리, print, printf, OFMT 변수  (0) 2013.04.21
Posted by scii
: