본문 바로가기

01. operation/iii. Shell Script

awk script 기초

Awk 자주 쓰게 되는 쉘상에서 데이터 조작이 필요 경우 입니다. (물론 awk, sed, grep 등등 조합으로 쓰기도 하지만)

 

히스토리는 관련 검색을 하면 많이 나오므로, 실무에서 사용 가능한 부분만 정리합니다.

 

알아야 단축어

FS

필드 분리자

awk -f "FS"

print

인쇄명령 (화면 출력)

Awk '{print $0}'

printf

Print 확장 (깔끔한 출력?) - 여타 다른 언어와 마찬가지로 char=c, int=d 제공

echo "awk" |awk '{printf "|%-15s|\n",$1}'

echo "awk" |awk '{printf "|%15s|\n",$1}'

OFMT

숫자 포맷 제어 (output format) : default %.6g (소수점 6자리 혹은 위로 6자리)

 

NR

레코드 번호

awk '{print NR" "$0}'

NF

현재 레코드에서 전체 필드

awk '{print NF}'

FNR

현재 파일의 전체 레코드

Awk '{print FNR}'

IGNORECASE

대소 무시

Awk -F: "{IGNORECASE=1}"

 

 

 

 

사용방법

 #>awk 'pattern' filename'

 

샘플 파일 (1.txt)

Kim 123 11/1/2 333

Wang 321 33/2/12 222

1Kim 222 33/11/33 333

  1. Awk 기본 구분자

Tab 문자열 혹은 공백입니다.

 

예제 > awk 1.txt '{print $1}'

          Kim

          Wang

Kim

123

11/1/2

333

Wang

321

33/2/12

222

$1

$2

$3

$4

 

처럼 컬럼이 나눠져 들어갑니다.

 

  1. 특정 패턴을 구분자로 경우

예제 > awk -F"/" 1.txt '{print $1}'

         Kim 123 11

 Wang 321 33

Kim 123 11

1

2 333

Wang 321 33

2

12 222

$1

$2

$3

 

시스템 명령어 조합으로 사용하기 ( | :파이프라인을 사용)

예제 > df|awk '{print $6}'

Mounted

/

/dev/shm

/data

/home

df 정보가 아래 처럼 나오는데 여기서 문자열을 구분해 $6번째 컬럼을 보여주는 예제입니다.

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda1             28898428   2552004  24878472  10% /

tmpfs                  1027296         0   1027296   0% /dev/shm

/dev/sda3             10321208   3427544   6369376  35% /data

/dev/sda2             61927420  42257352  16524340  72% /home

 

====================================================================

Awk 라인단위로 읽어 $0라는 내부변수에 담습니다. ( awk '{print $0' filename 라인 전체 출력)

 

awk -f 사용법

 awk -f (awk명령어 파일) filename

 

 예제> awk.run

{print $1" Hello~~~~"}

{print $1 $2}

 실행 > awk -f awk.run 1.txt

awk -f awk.run 1.txt

Kim Hello~~~~

Kim123

Wang Hello~~~~

Wang321

  라인에 대해 예제의 awk.run 파일을 적용하여 나타나도록 합니다.

 

grep 명령어 대용으로 awk 사용

예제> awk '/Kim/ {print $1 "   :" NR}' x

Kim   :1

        / / 부분은 정규식 표현이 가능하다

예제> awk '/^[K1]/ {print $1 "   :" NR}' 1.txt

Kim   :1

1Kim   :3

예제 > awk '/Wang/,/1Kim/ {print $0}' 1.txt

Wang 321 33/2/12 222

1Kim 222 33/11/33 333

Awk 필드 매치 (~)

예제> awk '$1~/Kim/{print $0 ":" NR}' 1.txt

Kim 123 11/1/2 333:1

1Kim 222 33/11/33 333:3

$1필드에서 Kim 포함된 라인전체와 줄번호 출력

예제> awk '$1!~/Kim/{print $0 ":" NR}' 1.txt

Wang 321 33/2/12 222:2

$1필드에서 Kim 들어가 있지 않은 라인 전체와 줄번호 출력

 

비교연산 (클까? 작을까? 같을까? 아니면 정규표현식? 위에 필드 매치 ~ 참조)

예제 >awk '$2 > 200' 1.txt

Wang 321 33/2/12 222

1Kim 222 33/11/33 333

 

If

 usage: (A ? B : C;)

{

if ($1 > $2)

x=$1

else

x=$2

}

 

예제> awk '{x=($2 > $4) ? $2 : $4; print x}' 1.txt

333

321

333

  1. $2번과 $4필드값을 비교
  2. $2 필드가 $4보다 크면
  3. 물음표 ? $2값을 x 할당
  4. 그렇지 않으면 : 뒤의 $4값을 x 할당

 

특정 컬럼 전체 SUM하기

예제> awk '{sum+=$2} END {print sum}' 1.txt

특정 컬럼끼리 SUM하기

예제> awk '{sum=$2+$4; print sum}' 1.txt

Awk에서 특정 변수 선언해서 사용하기

예제> awk1.run (파일생성)

         {print $var}

        awk -f awk1.run -v var=2 1.txt

123

321

222



아직은 기초입니다...기초..=_=;;Awk 자주 쓰게 되는 쉘상에서 데이터 조작이 필요 경우 입니다. (물론 awk, sed, grep 등등 조합으로 쓰기도 하지만)

 

히스토리는 관련 검색을 하면 많이 나오므로, 실무에서 사용 가능한 부분만 정리합니다.

 

알아야 단축어

FS

필드 분리자

awk -f "FS"

print

인쇄명령 (화면 출력)

Awk '{print $0}'

printf

Print 확장 (깔끔한 출력?) - 여타 다른 언어와 마찬가지로 char=c, int=d 제공

echo "awk" |awk '{printf "|%-15s|\n",$1}'

echo "awk" |awk '{printf "|%15s|\n",$1}'

OFMT

숫자 포맷 제어 (output format) : default %.6g (소수점 6자리 혹은 위로 6자리)

 

NR

레코드 번호

awk '{print NR" "$0}'

NF

현재 레코드에서 전체 필드

awk '{print NF}'

FNR

현재 파일의 전체 레코드

Awk '{print FNR}'

IGNORECASE

대소 무시

Awk -F: "{IGNORECASE=1}"

 

 

 

 

사용방법

 #>awk 'pattern' filename'

 

샘플 파일 (1.txt)

Kim 123 11/1/2 333

Wang 321 33/2/12 222

1Kim 222 33/11/33 333

  1. Awk 기본 구분자

Tab 문자열 혹은 공백입니다.

 

예제 > awk 1.txt '{print $1}'

          Kim

          Wang

Kim

123

11/1/2

333

Wang

321

33/2/12

222

$1

$2

$3

$4

 

처럼 컬럼이 나눠져 들어갑니다.

 

  1. 특정 패턴을 구분자로 경우

예제 > awk -F"/" 1.txt '{print $1}'

         Kim 123 11

 Wang 321 33

Kim 123 11

1

2 333

Wang 321 33

2

12 222

$1

$2

$3

 

시스템 명령어 조합으로 사용하기 ( | :파이프라인을 사용)

예제 > df|awk '{print $6}'

Mounted

/

/dev/shm

/data

/home

df 정보가 아래 처럼 나오는데 여기서 문자열을 구분해 $6번째 컬럼을 보여주는 예제입니다.

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda1             28898428   2552004  24878472  10% /

tmpfs                  1027296         0   1027296   0% /dev/shm

/dev/sda3             10321208   3427544   6369376  35% /data

/dev/sda2             61927420  42257352  16524340  72% /home

 

====================================================================

Awk 라인단위로 읽어 $0라는 내부변수에 담습니다. ( awk '{print $0' filename 라인 전체 출력)

 

awk -f 사용법

 awk -f (awk명령어 파일) filename

 

 예제> awk.run

{print $1" Hello~~~~"}

{print $1 $2}

 실행 > awk -f awk.run 1.txt

awk -f awk.run 1.txt

Kim Hello~~~~

Kim123

Wang Hello~~~~

Wang321

  라인에 대해 예제의 awk.run 파일을 적용하여 나타나도록 합니다.

 

grep 명령어 대용으로 awk 사용

예제> awk '/Kim/ {print $1 "   :" NR}' x

Kim   :1

        / / 부분은 정규식 표현이 가능하다

예제> awk '/^[K1]/ {print $1 "   :" NR}' 1.txt

Kim   :1

1Kim   :3

예제 > awk '/Wang/,/1Kim/ {print $0}' 1.txt

Wang 321 33/2/12 222

1Kim 222 33/11/33 333

Awk 필드 매치 (~)

예제> awk '$1~/Kim/{print $0 ":" NR}' 1.txt

Kim 123 11/1/2 333:1

1Kim 222 33/11/33 333:3

$1필드에서 Kim 포함된 라인전체와 줄번호 출력

예제> awk '$1!~/Kim/{print $0 ":" NR}' 1.txt

Wang 321 33/2/12 222:2

$1필드에서 Kim 들어가 있지 않은 라인 전체와 줄번호 출력

 

비교연산 (클까? 작을까? 같을까? 아니면 정규표현식? 위에 필드 매치 ~ 참조)

예제 >awk '$2 > 200' 1.txt

Wang 321 33/2/12 222

1Kim 222 33/11/33 333

 

If

 usage: (A ? B : C;)

{

if ($1 > $2)

x=$1

else

x=$2

}

 

예제> awk '{x=($2 > $4) ? $2 : $4; print x}' 1.txt

333

321

333

  1. $2번과 $4필드값을 비교
  2. $2 필드가 $4보다 크면
  3. 물음표 ? $2값을 x 할당
  4. 그렇지 않으면 : 뒤의 $4값을 x 할당

 

특정 컬럼 전체 SUM하기

예제> awk '{sum+=$2} END {print sum}' 1.txt

특정 컬럼끼리 SUM하기

예제> awk '{sum=$2+$4; print sum}' 1.txt

Awk에서 특정 변수 선언해서 사용하기

예제> awk1.run (파일생성)

         {print $var}

        awk -f awk1.run -v var=2 1.txt

123

321

222

'01. operation > iii. Shell Script' 카테고리의 다른 글

awk로 합계를 뽑아내보자.  (0) 2009.07.27
문자열 변경  (0) 2009.07.27