반응형

 1. awk ?
awk는 데이터 양식이나 문서나 혹은 자료를 처리하여 다른 형태의 문서 또는 결과물을 출력하는데 사용한다.

2. awk 의 구조
  - 시작 (BEGIN) : 입력데이터를 실행하기에 적합한 형태로 바꾸어 주는 단계
  - 실행 (Routine) : 잘 덩리된(정규화된) 데이터를 실제 루틴으로 처리하는 단계
  - 종료 (END) : 데이터가 처리된 후에 결과의 추가 출력

3. awk 의 사용
일반적으로 grep 과 같이 사용된다.

  1. grep 을 이용하여 데이터 파일의 구조 확인
  2. 정규화가 가능하지를 확인하고 sed로 테스트 한후에 awk 가 처리할수 있을정도로 
     정규화되있다면 awk를 사용
  3. sed로 정규화된 양식을 awk 로 처리

■■■■ ■■ ■■■■ ■ ■■■■■■■ ■
■■ ■■ ■■ ■■ ■■■■■■■■■ ■■
■■■■■■■■■■ ■■ ■■ ■■ ■ ■ 

위의 데이터 형식은 아래의 형식으로 바뀌게 된다.
R1  ■■■■                ■■ ■■■■ ■    ■■■■■■■      ■
R2  ■■                     ■■ ■■      ■■ ■■■■■■■■■ ■■
R3  ■■■■■■■■■■ ■■ ■■      ■■ ■                     ■ 
      F1                      F2   F3        F4   F5                    F6
      $1                      $2   $3         $4   $5                    $6

만약 awk 로 위의 데이터를 출력하면

awk '{print $1}' 위의데이터
■■■■
■■
■■■■■■■■■■

이렇게 출력된다.


 

awk [option] 'script' [file]



4. awk 의 옵션

-Fc : field separator 지정 (c 가 구분자이며 기본은 공백으로 설정)
-v 변수=값 : 스크립트를 실행하기 전에 미리 변수에 값을 지정
-f : 스크립트 파일을 지정



5. awk 의 응용

패턴 {동작}
커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표(')로 묶어야 한다.
 - 패턴만 있는 경우 : 패턴과 일치하는 라인을 화면에 출력
 - 동작만 있는 경우 : 모든 라인이 동작의 대상이 됨


 

패턴
- /정규식표현/ : 정규식으로 표현된 패턴과 일치 여부
- 비교연산 : 숫자, 알파벳 모두 사용가능
- 패턴 매칭 연산 : ~ 일치하는 부분 , !~ 일치하지 않는 부분
- BEGIN : 첫번째 레코드가 읽혀지기 전에 어떤 동작을 정의
- END : 마지막 레코드가 모두 읽혀진 후에 어떤 동작을 정의

동작
- 동작은 모두 {}로 둘러싸야 한다.


시스템 변수

 시스템 변수  설명 
 FILENAME  현재 파일명 
 FS  입력 필드 구분
 기본 : 공백
 NF  현재 레코드 필드 갯수
 NR  현재 레코드 번호
 OFMT  숫자에 대한 출력 포맷
 기본 : $.6g
 OFS  출력 필드 구분
 기본 : 빈줄
 ORS  출력 레코드 구분
 기본 : newline
 RS  입력 레코드 구분
 기본 : newline
 $0  입력 레코드
 $n  입력 레코드의 N번째 필드
 ARGC  커맨드 라인의 인자 개수
 ARGV  커맨드 라인 인자를 포함하는 배열
 ENVIRON  환경 변수들을 모아둔 관계형 배열
 FNR  NR과 동일
 단지 현재 파일에 적용된다는 점이 다름
 RSTART  지정한 매칭 연산을 만족하는 문자열의 맨 앞부분
 RLENGTH  지정한 매칭 연산을 만족하는 문자열의 길이


 

연산자

 산술연산자  =, +=, -=, *=, /=, %=
 조건연산자
 (condition)? (true) : (fales)
 논리연산자  ||, &&, !
 패턴연산자  ~, !~
 비교연산자  <, <=, >, >=, !=, ==
 증감연산자  ++, --
 필드참조  $


 

제어문

문법 자체는 C언어의 제어문과 같다.
 - break
 - continue
 - do { Routine } while (condition)
 - exit
 - for ( init ; condition ; re ) { Routine }
 - if ( condition ) { Routine } else { Routine }
 -  while (condition) { Routine }
 - return 


 

함수

 - 문자열 함수
 
 함수명 설명 
 gsub(r, s)
 입력 문자열 전부에 걸쳐 정규식표현 r을 문자열 s로
 치환한다.
 gsub(r, s1, s2)
 입력문자열 s2 에서 정규식 표현 r을 문자열 s1 으로
 치환한다.
 index(s1, s2)
 s1에서 s2의 위치를 넘겨준다. 없다면 0
 length(arg)  인자의 길이를 넘겨준다.
 match(s, r)
 문자열 s에서 정규식표현 r과 매칭 되는 부분의 
 위치를 넘겨준다.
 split(string, array[, seperator])
 구분자를 기준으로(기본:공백)해서 지정한 문자열을 
 배열로 만든다.
 sub(r, s) , sub(r, s1, s2)
 gsub 와 동일
  정규식식표현과 일치하는 문자열이 여러개라도 
 처음 한 문자열만 치환
 substr(s, m)
 문자열 s 에서 m번째 위치에서 끝까지 문자열을 
 넘겨준다.
 substr(s, m, n)
 문자열 s 에서 m번째 부터 n번째까지의 문자열을
 넘겨준다
 tolower(string)  대문자를 소문자로 바꾼다.
 toupper(string)  소문자를 대분자로 바꾼다.


- 수학 함수
 
 함수명 설명 
atan2(x, y)
 archtangent 값
cos(x)
 cos 값
exp(x)
 자연대수 e의 제곱
int(x)
 정수형으로 반환
log(x)
 로그
rand()
 0에서 1까지의 랜덤수
sin(x)
 sin 값
sqrt(x)
 제곱근
srand(expr)
 인자를 가진 난수(없으면 시간을 가지고 난수 발생)


- 입출력 함수
 
 함수명 설명 
close(filename)
 지정한 파일을 닫는다.
close(cmd)
 지정한 명령어 파이프를 닫는다.
delete array[element]
 지정한 배열요소를 지운다.
getline()
 다음 레코드를 읽어 들인다.
getline [variable] [< "filename"]
 파일에서 읽어드린다.
next
 다음 레코드를 입력받는다.
print [args] [> "filename"]
 인자를 출력한다
printf "format" [,exp] [> "filename"]
 형식에 맞춰 인자를 출력한다.
sprintf(format [,exp])
 printf와 마찬가지로 사용되지만 값을 
 리턴하기만 하고 출력은 하지 않는다.
system(cmd)
 시스템 내부 명령어를 실행한다.



6. 예문

1에서 10까지 출력

awk 'BEGIN { for (i = 1;i<=10;i++)  print i }'



현재 디렉토리의 파일들이 이름만 출력

ls -al | awk '{print $9}'



연재 디렉토리의 파일 이름중에 소문자 알파벳이 포함된 파일명은 출력하지 않음

ls -al | awk '/^[a-z]/{ print $9  }'





 

반응형

'리눅스 쉘 스크립트' 카테고리의 다른 글

Find 응용  (0) 2019.08.21
awk 명령어 예제  (0) 2018.01.16
find 사용하기  (0) 2018.01.15
grep 으로 다중 문자열 검색  (1) 2018.01.15
grep 정규 표현식 패턴 예제 두 가지  (0) 2018.01.15

+ Recent posts