AWK 설명 - 문법 형식.

AWK 소개
  • awk 는 텍스트 정보의 통계 로 보고 서 를 작성 하 는 도구 입 니 다. awk 는 자신의 문법 이 있 고 독립 된 프로 그래 밍 언어 입 니 다.
  • awk 는 텍스트 파일 에서 내용 을 읽 거나 표준 입력 에서 내용 을 읽 는 것 을 지원 합 니 다.
  • awk 의 최종 기원 은 줄 편집기 ed 에서 비롯 되 었 습 니 다. awk 는 줄 편집기 의 특징 을 계승 하여 텍스트 의 줄 마다 (또는 구분자 가 분 단 된 모든 텍스트) 텍스트 가 끝 날 때 까지 반복 적 으로 읽 었 습 니 다. 그러나 awk 는 세그먼트 분할 문자 라 는 개념 을 추가 하 였 습 니 다. 읽 을 때마다 줄 을 다시 분할 합 니 다. awk 가 읽 을 때마다 awk 문 구 를 처리 하지 않 은 대상 일 뿐 입 니 다.줄 을 읽 은 후 세그먼트 분할 문자 에 따라 줄 을 여러 대상 으로 나 눕 니 다.구조 가 배열 과 비슷 한 다음 에 지 정 된 문장의 조작
  • 을 한다.
  • awk 의 명령 에 대한 처 리 는 명령 의 해석 이나 스 크 립 트 언어의 해석 이 라 고 할 수 있 습 니 다.awk 의 구문 쓰기 형식 은 모듈 화 스타일 에 속 합 니 다. 특히 if, else 문 구 는 bash 의 익명 함수 와 유사 합 니 다.각 구문 블록 은 {} 을 사용 하여 제약 해 야 합 니 다
  • awk 의 기본 실행 과정:
  • BEGIN 구문 블록 의 내용 을 실행 합 니 다. 문 구 는 선택 가능 한 구문 입 니 다. 실행 변수의 초기 화, 보고서 의 헤더 출력 에 많이 사 용 됩 니 다.
  • 표준 입력 이나 파일 에서 줄 분할 자 (- F 가 정의 하 는 문자) 분 할 된 줄 을 읽 고 메모리 에 들 어가 문장 이전의 조건 을 일치 시 킵 니 다. 조건 이 없 을 때 기본 값 은 실행 조건 에 부합 합 니 다. 조건 에 부합 되 지 않 으 면 다음 문장 이전의 조건 과 일치 하려 고 합 니 다. 모든 조건 이 완 료 될 때 까지 기본 값 으로 {print $0}
  • 을 실행 합 니 다.
  • 다음 줄 을 끝까지 읽 습 니 다
  • END 가 정의 한 문장의 내용 도 선택 할 수 있 는 문장 입 니 다. 보고서 의 통계 정보 출력 에 많이 사 용 됩 니 다.
  • 기본 형식:
    awk
  • bash 명령 행 에서 awk 를 실행 할 때 awk 에 문 구 를 전달 할 때 문 구 는 bash 가 우선 설명 합 니 다.즉, awk 에 문 구 를 전달 할 수 있 을 때 bash 는 이상 한 것 을 전개 할 수 있 습 니 다. 예 를 들 어 시스템 변수, 예 를 들 어 {1. 4}
  • 옵션:
  • - f 파일 에서 처리 명령 을 읽 기 - F 가 가리 키 는 줄 의 세그먼트 구분자;입력 할 때의 데 이 터 를 분할 합 니 다.지원 모드 일치.확 장 된 정규 표현 식 입 니 다. 줄 을 여러 대상 으로 나 누 거나 순환 할 때마다 처리 할 대상 (최소 처리 단위) 이 무엇 인지 확인 하 는 것 이 목적 입 니 다. 기본 - v 사용자 정의 변수 awk - v
  • 조건:
  • awk 는 하나의 언어 입 니 다. 프로 그래 밍 의 시각 으로 조건 을 보 세 요.조건 은 조건 을 집행 한 후의 문장의 요구 이다.조건 에 맞 아야 문 구 를 실행 할 수 있 습 니 다. 조건 은 바로 문장 에 대한 판단 입 니 다. 정규 매 칭 을 사용 할 수 있 습 니 다. 정규 모드 를 바탕 으로 경 계 를 정 하고 문자열 을 비교 할 수 있 습 니 다. 산수 조건 식 을 사용 할 수도 있 고 BEGIN, END 의 특수 조건 일 수도 있 습 니 다.산수 조건 식 은 최종 적 으로 연산 결 과 를 되 돌려 줍 니 다. 연산 결과 가 0 일 때 문 구 는 실행 되 지 않 습 니 다.조건 검증 을 할 때 줄 은 최소 단위 로 나 뉘 었 고 최소 단위 의 작은 수량, 내용, 줄 번호 등 정 보 를 통계 했다.
  • 조건 이 비어 있 을 때 줄 당 실행
  •  :  _            
        awk '/^UUID/{print $1}' /etc/fstab   #   UUID     ,   {}    。print $1   
        awk '!/^UUID/{print $1}' /etc/fstab  #    UUID     ,  {}     。print $1
    
     :    _            ,          。
        awp -F: '$3>=1000{print $1,$3}' /etc/passwd
        awp -F: '!$3>=1000{print $1,$3}' /etc/passwd
        awk -F: '(NR>=2&&NR<=10){print $1}'
    
     :     _          
        awk -F'$NF="/bin/bash"{print $1,$NF}' /bin/passwd
        awk -F'$NF~/bash$/{print $1,$NF}' /bin/passwd
        awk -F: '! ($NF=="/bin/bash")' /etc/passwd
    
     :   _         ,         
        awk -F'10,20{print $1}'  #----     
        awk -F'/^root/,/^myuser/{print $1}'
    
     :    _BEGIN/END 
        awk 'BEGIN{print "  username    ID  
    ------------"}{printf "%10s:%-s" $1,$3}END{print "=========
    "}'
    # BEGIN: # END: , , : _0, awk -v aa="" 'aa' /etc/passwd # aa ,( )。 , 。 awk -v aa=" " 'aa' /etc/passwd # aa ‘ ’ awk -v aa="0" 'aa' /etc/passwd # aa 0, 0, 。 awk -v aa="1" 'aa' /etc/passwd # aa 1 , 1, 。 awk -v aa=0 'aa++' /etc/passwd #aa 0, a++, a 。 。 echo "123"| awk -v a=1 'a=0{print $1}' #a 1. a=0, a 。 a , 0, 。
  • 문장:
  • 조건 에 맞 게 실행 되 는 동작, awk 는 언어 이기 때문에 프로 그래 밍 의 사고 로 생각 합 니 다.다만 awk 의 변 수 는 대부분 awk 자동 할당 입 니 다.그리고 내부 에서 자신의 규칙 에 따라 자동 으로 변화 합 니 다 (예 를 들 어 줄 카운터 NR, 예 를 들 어 $1 등) {} 에 여러 개의 문구 가 존재 할 때 사용 합 니 다.분리 하 다.
           ,    {print $0}
    awk '!0' /etc/passwd
    

    print :
                   
    “”       
           
    $       
           
             ,     (      )
    #       ,      print      ,      
     :  >>echo "hello" |awk '{print}'
          hello
    
    #           ,       ,        echo "hello word" |awk  '{print $1"\t"$2}'
        hello   word
    
        echo "hello word" |awk  -F' ' '{print $1"---"$2}'
        hello---word
    
        echo "hello word" |awk  -F' ' '{nu=10;print $1"---"$2"---"nu}'
        hello---word---10
    
    #     ,     ,        ,        ,           echo "hello word" |awk  -F' ' '{print $1$2}'
        helloword
    
        echo "hello:word:haha:asd" |awk  -v FS=':' -v OFS='---' '{print $1$2}'
        helloword
    
        echo "hello:word:haha:asd" |awk  -v FS=':' -v OFS='---' '{print $1,$2}'
        hello---word
    
        echo "hello:word:haha:asd" |awk  -v FS=':' -v OFS='---' '{print $1,$2,$1$2}'
        hello---word---helloword

    printf
            
    
       :
        %c ascii
            echo "asd"| awk '{printf "%c
    ",$1}'
    %d i echo "123"| awk '{printf "%-d
    ",$1}'
    %e %E %f %s echo "123"| awk '{printf "%s
    ",$1}'
    123 echo "123"| awk '{printf "%s
    ","asd"}'
    asd %% % %g %G %u : # #。#; # - : , 。 + :

    조건 식:
      :  ?       :        
    awk ‘{$3>=1000?usertype="......":usertype="::::::";printf "%15s:%-s
    "
    ,$1,usertype}’

    제어 문:
    if:
      :
        if(  ){  }
        if(  ){  } else {  }
     :
        awk -F: '{if($3>1000) print $1,$3}' /etc/passwd  #       
        awk -F: '{if($3>1000){printf "    :%s",$1} else {printf "    :%s",$1}}' #          ,    。
        df -h |awk -F% '/\/dev\/sd/{print $1}'|awk '{if($NF>=16)print $1}'
        df -h |awk -F% '/\/dev\/sd/{print $1}'|awk '$NF>=16{print $1}'

    순환 구문:
    whilewhile (  ) {  }
                     ,        。
        awk '/^[[:space:]]*linux/{i=1;while(ilength($i);i++}}' /etc/grub2.cfg
        awk '/^[[:space:]]*linux/{i=1;while(iif(length($i)>7){print $i,length($i)};i++}}' /etc/grub2.cfg
        awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10){print $i,length($i)}; i++}}' /etc/grub2.cfg
    dodo{  } while(  )
                dowhiledo    。
            awk 'BEGIN{total=0;i=0;do{total+=i;i++;}while(i<=100);print total}'
            awk 'BEGIN{total=0;i=0;while(i<=100){total+=i;i++};print total}'
    forfor (i=1;i<10;i++){  }
                awk /[[:space:]]*linux/{for(i=1;i<=NF;i++){print $i,length($i)}} /etc/grub2.cfg
            for           :
                   :for (i in     )    i         ,
    switch
        
    
    breakbreak # :  #   
    
    contiune
                   , continue # :    #      。
    
    next :         ,     。gawk       ,      ,      
            awk -F: '{if($3%2!=0) next;print $0 }' /etc/passwd
                 
    delete
    exit

    함수:
        
    
        lrngth
                      ,   。
             :  echo "asdd"|awk '{print length($1)}' #          。
    
    randsrand
            randsrand            
             : awk 'BEGIN{srand();for(i=1;i<=10;i++){print int(rand()*100)}}'
    
    sub
              sub(r,s,[t])
                 t(         ,  ,    ), t      ,     r ,   r         s    ,     1   
             : echo "2008:08:08:08 08:08:08:08" |awk 'sub(/:/,"-",$0)'
    
    gsub
               gsub (r,s,[t])
                 t(         ,  ,    ), t      ,     r ,   r         s    ,         t      。
             : echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw"|awk '{gsub(/[^0-9]/,"",$0);print $0}'
            echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw"|awk 'gsub(/[^0-9]/,"",$0)'
    
    split
               split(a,array,[r])
             r    ,     a,               ,      1  ,      1,      2.
            netstat -tan |awk '/^tcp/{split($4,ip,":");a[ip[1]]++}END{for(i in a){print i,a[ip[1]]}}'
    
    int
               int(       ,    )
                         。
    
    system
              : system("    ")
                            。     bash    ,      awk   ,          ,   awk   ,    awk   。      bash       awk            。           ,     。
             :awk 'BEGIN{system("hostname")}'
               awk 'system("hostname"){i=0}'
    function      (  1 ,  2 。。。){
          1 
          2
        return   
            }
    
                ,  awk  。
        #cat fun.awk
            function max(v1,v2) {
            v1>v2?var=v1:var=v2
            return var
            }
            BEGIN{a=3;b=2;print max(a,b)}
        #awk –f fun.awk
    
                ,  shebang,      。
     awk      ,       
        #cat f1.awk
            {if($3>=1000)print $1,$3}
        #awk -F: -f f1.awk /etc/passwd
    
        #cat f2.awk
            #!/bin/awk –f
            #this is a awk script
            {if($3>=1000)print $1,$3}
            #chmod +x f2.awk
        #f2.awk –F: /etc/passwd
    awk       :
      :
    awkfile var=value var2=value2... Inputfile
      : BEGIN      。          , 
        。    -v   , awk   BEGIN    
        。                 -v  
    #cat test.awk
        #!/bin/awk –f
        {if($3 >=min && $3<=max)print $1,$3}
    #chmod +x test.awk
    #test.awk -F: min=100 max=200 /etc/passwd

    데이터 참조:
          
            ,    ,    ,            ,
    $1 :        
    $2 :        
             ,           ,           
    ,awk, , , 。

    변수:
         。
                -v FS=" "    -v        ,
        FS:        ,       
        OFS:        ,        。
        RS:          ,       ,
        ORS:        ,      
        NF :        
        NR :     ,           ,      
        FNR :            。
        FILENAME :       
        ARGC :          
        ARGV :        ,ARGV   ,               ,        
          
        -v var=value
                      
                    ;   
    

    조작 부호
          :
           :
    x+y x-y x*y x/y x^y x%y
          :
    -x : x       
    +x :    x        
             :         
          :
    + += -= *= /= ^= %=
    ++  --
    > >= < <= != ==
    

    패턴 일치:
    ~ :      
    !~:          
          :
     &&  || !
          :
        (   ,   )
    

    배열:
    awk        ,  Python    。
                    ,        
              ,          none,         none      0    。
        
    array[\$1]=aa
    array[\$1]++ 
    awk '!arr[\$0]++' /etc/fstab
              ,                , none           1,      !          ,           ,     1,  !  ,   ,     . 
    awk '{arr[$0]++;print $0,arr[$0]}'
                     .
    
        
    netstat -tan | awk '/tcp\>/{stat{$NF}++}END{for(i in stat){print i,stat[i]}}
    

    좋은 웹페이지 즐겨찾기