리눅스

AWK

ho-bolt 2021. 10. 27. 23:36

AWK

AWK의 기능을 디자인한 사람들의 이니셜로 이다. 

A:  Alfred V. W:Peter J. [w]einbergerK : Brian W. [K]ernighan

 

사용방법 awk [옵션 ] [awk 프로그램 ] [파일명] 형태로 사용

 # 옵션 

# -F(Field) : 필드 구분자 지정 

# -f (file): awk 프로그램 파일 경로 지정 

# -v :: awk 프로그램에서 사용할 유효한 특정 값지정 

 

 

grep 가 행으로 패턴에 해당하는 값을 찾았다면

awk는 열로 패턴에 해당하는 값을 찾는다. 

 

 

#awk 프로그램 기본 구조 

pattern { action } 형태 => ex. ) echo -e 'no\title\t\n1\tsubject1' | awk '/sub/ { print }'

pattern 을 생략하면 모든 레코드가 적용된다. => ex. ) echo -e 'no\title\t\n1\tsubject1' | awk ' { print }'

무엇을 찾아야 할 지 몰라 다 가져온다. 

action을 생략하면 기본 액션인 print가 실행된다 =>  ex. ) echo -e 'no\title\t\n1\tsubject1' | awk '/sub/'

/sub/== 가 바로 패턴이다. 

 

필드를 호출하기 위해서는 $를 사용한다. 

 

$0을 하면 모든 것이 출력된다. 

이렇게 해당 액션앞에 이해하기 쉽도록 문자를 넣을 수도 있다. 

 

for문 삽입도 가능 echo 필드를 나누는 기준은 띄어쓰기다 

 

이 awk 반복문에 대해 설명하자면 

 

i=열을 나타내는 데  i=3은 3번째 열 부분을 나타낸다. 즉 3번 째 필드인 3  8을 나타낸다. 

NF 는 해당 행의 열의 개수를 나타낸다. 

첫 번째 행의 NF는 4 두 번째는 2 3번째는 3이다. 

for문에서 NF는 4인데 4보다 작으니 첫 째 행의 3번째인 3이 출력된다. 

두 번째 행으로 가서 NF는 2인데 i=3이라 3번째 값이 없어 0 이출력된다

NF=3이고 i=3이라 3보다 작은 3은 없기 때문에 0이 출력된다. 

 

 

 

 

따라서 밑에 코드는 필드 1번 $1만 나오게 출력을 했는데 1:2:3은 공백이 없어 1개의 필드로 인식하여 다 나온게 되었다. 따라서 필드 구분하는 구분자를 내가 원하게 세팅해줘야 한다.

그 옵션은 바로 -F 옵션을 주면 된다.

이렇게 -F 옵션 뒤에 구분자로 할 것을 세팅해주면 그것을 구분자로 인식한다.

 

 

awk 파일로 만들어서 호출하는 방법

vi awk.awk.에 {print}를 넣은 다음 cat .awk.awk로 파일을 읽어오면 호출이된다.

또한 awk로 보기 위해서 -f 옵션을 주어 awk.awk.로 파일경로를 지정해줄 수도 있다. 

하지만 자주 사용되진 않는다. 

 

 

awk 연산기능 

 

$3+2를 함으로소 3 0 8에 각각 2가 더해진 것을 알 수 있다. 이렇게 연산기능도 수행이 가능하다. 

 

 

길이 

$0은 전체를 의미하고 awk 'length'를 사용하여 길이가 6보다 큰 것을 출력한다고 시킬 수도 있다. 

 

 

BEGIN END 사용

 

BEGIN은 무조건 앞에 출력을 해주는 것을 말한다. 그리고 END는 끝에 출력해주는 것을 말한다

 

%사용 ==넓이 

%는 몇 칸만큼 공백을 주겠다는 의미이다. 

즉 $1에 대해 3칸만큼 공백을 주겠다. 

$2는 8칸을 사용하겠다. 

$3는 4칸만큼 사용하겠다. 

즉 출력 넓이를 정할 수 있다. 

728x90