쉘 스크립트 - 5
awk
- 먼저 실행된 명령어의 결과나 인자로 받은 파일을 기반으로 레코드를 선택하고 해당 레코드의 인덱스를 검색하여 특정 인덱스에 해당하는 문자열을 출력한다
= 표형식의 데이터에서 특정 레코드와 필드 값을 추출하는 명령어
= 표 형식으로 정리된 텍스트를 검색하여 해당 문자열(행)을 기준으로 특정위치의 데이터(문자열)를 출력
= 텍스트 형태로 되어있는 입력 데이터를 행과 단어 별로 처리해 출력하는 명령어
- awk는 GNU기반의 gawk, 디버거역할을 하는 dawk, BSD나 Debian 계열에서 사용하는 mawk등이 있다
- 장점은 file open필요 없이 입출력이 간단하나는 장점이 있다.
- 명령어 이해를 위한 사이트: https://recipes4dev.tistory.com/171
https://mug896.github.io/awk-script/getline.html
- 사용법
: awk 옵션 '패턴{액션}' 대상파일
: awk 옵션 -f awk스크립트 대상파일
: 명령어 | awk 옵션 '패턴{액션}'
- awk 명령어는 어떤값을 추출할 것인지를 명시하는 패턴과 패턴으로 추출된 레코드를 전부 출력할지 아니면 특정필드값만 출력할지를 명시하는 액션으로 구성됨
- awk 명령어는 패턴이 명시되지 않으면 액션에 명시된 필드값을 전부 출력함
- 액션: 제어문(조건/반복문)과 입출력문(print)으로 구성됨
print : 대상파일의 내용을 그대로 출력, 패턴을 넣고 사용시 grep명령어를 사용한것과 유사한 결과가 나옴
print 필드리스트 : print $1, $3 식으로 필드리스트를 넣으면 파일의 해당 필드의 값이 출력됨. ','가 있어야 각 필드 값 사이에 스페이스가 들어감
print 필드리스트 > 파일 : 해당 결과값을 파일에 저장
printf 포맷, 필드리스트 : 위와는 달리 printf이다. 포맷을 적을때 ''가 아닌 ""로 포맷을 정의해야함
printf 포맷, 필드리스트 > 파일 : 해당 결과값을 파일에 저장
getline : print등과 함께 사용되며, 파일의 한 라인을 읽는다는 의미를 가지는 액션, print문 앞에 사용되어야하며 파일의 짝수번째 라인을 읽는다
getline var : getline와 같으며, 차이는 파일의 홀수번째 라인을 읽는다
-> 그런데, 파일이 3줄일때 getline 만 쓰면 1줄만 출력되어야하는데 왜 2번째, 3번째 라인이 출력되는가?(10줄정도면 정상적으로 출룍됨)
getline < 파일 : 파일로부터 데이터를 읽어 출력시 대상파일의 데이터를 교체한다
ex) awk '{getline $1 < "aa.txt"; print}' bb.txt
: aa.txt파일에서 데이터(레코드)를 읽어 bb.txt의 1번째 필드값을 aa.txt에서 읽은 데이터로 대체한다
(필드값을 명시하지 않으면 bb.txt의 전체내용이 aa.txt에서 읽은 데이터로 대체되며, 출력만 그럴뿐이지 실제 aa.txt, bb.txt의 내용이 변하지는 않는다
getline var < 파일 : 파일의 내용을 var 변수에 저장한다. 이때 var에 저장되는 데이터가 숫자일 경우 다음과 같이 응용이 가능다
ex) aa.txt에 1값이 저장되어있을 경우
awk '{getline var < "aa.txt"; print $var}' bb.txt
: bb.txt의 첫번째 필드값을 출려가한다
- 패턴: 파일에서 어떤 레코드를 출력할 것인지에 대해 명시
BEGIN {액션} : 파일의 첫번째 레코드를 읽기 전 액션을 먼저 처리하고 읽는다
END {액션} : 파일의 레코드를 읽고 난 후 액션을 처리한다
/정규표현식/ : 패턴을 정규표현식으로 작성할 경우 사용
관계식 : 필드와 패던을 비교할 경우 사용가능(산술연산자도 같이 사용할 수 있다)
패턴 && 패턴 : AND 연산
패턴 || 패턴 : OR 연산
패턴1?패턴2:패턴3 : 3항 연산(패턴1: 조건, 패턴2: 참, 패턴3: 거짓)
(패턴) : 그룹핑(우리가 알고있는 그룹화, 우선순위를 높임, 가독성향상)
!패턴 : NOT연산
패턴1, 패턴2 : ','를 사용하여 범위를 표현, 패턴1부터 패턴2사이의 레코드를 출력함
- 옵션 : 옵션은 gawk나 mawk관계없이 동일하다
-f 파일 : 파일에 저장된 '패턴{액션}'을 사용하여 awk명령어를 실행한다
-F 구분기호 : 필드구분기호를 명사하는 기호로 변경하여 awk명령어를 실행한다
-v 변수=값 : 필드 및 레코드 출력시 출력하는 문자열에 변수가 있을 경우 해당 변수를 -v옵션으로 설정한 값으로 변경하여 출력
- 확장옵션: 디버그 옵션, 내장변수 정보, 에러메세지등을 표현할 때 사용
-b : 입력되는 문자열을 바이트로 처리한다. 해당옵션은 문자열길이를 구하는 length()와 같은 함수에 영향을 끼친다.
-C : GNU 라이센스 정보를 보여줌
-d파일명 : awk명령어의 내장변수와 값을 해당파일에 저장하여 확인할 수 있음
-h : 도움말
-L'fatal' : 구문오류에 대한 상세한 에러메세지를 보여줌
-V : awk 버전 정보 출력
** awk종류가 달라서 명령어가 듣지 않는 것 같다 help의 경우 -W help이다
(책에서는 gawk, 우분투는 mawk이다)
'Study > Shell' 카테고리의 다른 글
쉘 스크립트 - 7 (0) | 2021.07.29 |
---|---|
쉘 스크립트 - 6 (0) | 2021.07.28 |
쉘 스크립트 - 4 (0) | 2021.07.19 |
쉘 스크립트 - 3 (0) | 2021.06.23 |
쉘 스크립트 - 2 (0) | 2021.06.06 |