쉘 스크립트 - 5

2021. 7. 23. 15:40

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

+ Recent posts