셸 스 크 립 트 빠 른 입문 - 정규 3 총사 의 3 awk 용법 대전!!

글 목록
  • 1. awk 소개
  • 1. 명령 행 방식
  • 2. awk 명령 형식:
  • 3. 특수 요점:
  • 2. - F 지정 구분자
  • 3.//일치 코드 블록
  • 4. 조건 식
  • 5. 논리 연산 자
  • 6. 수치 연산
  • 7. 출력 구분자 OFS
  • 8. 포맷 출력
  • 9. IF 문장
  • 10. while 문장
  • 11. 배열
  • 12. 응용
  • awk
    awk 는 linux/unix 에서 텍스트 와 데 이 터 를 처리 하 는 프로 그래 밍 언어 입 니 다.데 이 터 는 표준 입력, 하나 이상 의 파일 또는 다른 명령 의 출력 에서 나 올 수 있 습 니 다.사용자 정의 함수 와 동적 정규 표현 식 등 선진 적 인 기능 을 지원 하 며 linux/unix 의 강력 한 프로 그래 밍 도구 입 니 다.명령 행 에 사용 되 지만 스 크 립 트 로 사용 되 는 경우 가 많 습 니 다.awk 의 텍스트 와 데 이 터 를 처리 하 는 방식 은 이 렇 습 니 다. 파일 을 한 줄 씩 스 캔 하고 첫 줄 에서 마지막 줄 까지 일치 하 는 특정한 패턴 의 줄 을 찾 아 원 하 는 동작 을 합 니 다.지정 한 처리 동작 이 없 으 면 표준 출력 (화면) 에 일치 하 는 줄 을 표시 하고 지정 한 모드 가 없 으 면 지정 한 줄 을 모두 처리 합 니 다.awk 는 각각 작가 성씨 의 첫 번 째 자 모 를 대표 한다.그 작 가 는 알 프 레 드 Aho, Brian Kernighan, Peter Weinberger 등 세 사람 이기 때문이다.gawk 는 awk 의 GNU 버 전 으로 Bell 실험실 과 GNU 의 확장 을 제공 합 니 다.
    1. 명령 행 방식
    awk [- F field - separator] 'commands' input - file (s) 에서 commands 는 진정한 awk 명령 이 고 [- F 역 구분자] 는 선택 할 수 있 습 니 다.input - file (s) 은 처리 해 야 할 파일 입 니 다.awk 에서 파일 의 줄 마다 도 메 인 구분자 로 구 분 된 항목 을 도 메 인 이 라 고 합 니 다.일반적으로 - F 도 메 인 구분자 가 가리 키 지 않 은 상태 에서 기본 도 메 인 구분자 가 빈 칸 입 니 다.
    2. awk 명령 형식:
    awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{} file
    
     [-F|-f|-v]      ,-F     ,-f    ,-v     var=value
    
    '  '               
    
    BEGIN         ,           ,     ,         ,  FS   
    
    //           
    
    {}           
    
                        
    
    END           ,                  ,                  
    

    3. 특별한 요점:
    $0                  
    
    $1                  
    
    NF                
    
    NR          
    
    FNR         NR  ,          ,      1  
    
    \t               
    
    \n              
    
    FS          BEGIN      
    
    RS              (           )
    
    ~            ==        
    
    !~           
    
    ==           ,      ,    
    
    !=           
    
    &&         
    
    ||                
    
    +                 1  1   
    
    /[0-9][0-9]+/            
    
    /[0-9][0-9]*/             
    
    FILENAME    
    
    OFS       
    
    ORS        ,                
    
    -F'[:#/]'          
    

    2. - F 지정 구분자
    $1        ,     ,$3 \t    
    
    awk -F":" '{print $1}'  /etc/passwd
    awk -F":" '{print $1 $3}'  /etc/passwd                       //$1 $3
    awk -F":" '{print $1,$3}'  /etc/passwd                       //      ,$1 $3      
    awk -F":" '{print $1 " " $3}'  /etc/passwd                  //$1 $3          
    awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd       //       
    awk -F: '{print NF}' /etc/passwd                                //         
    awk -F: '{print $NF}' /etc/passwd                              //    NF         
     awk -F: 'NF==4 {print }' /etc/passwd                       //    4     
    awk -F: 'NF>2{print $0}' /etc/passwd                       //          2  
    awk '{print NR,$0}' /etc/passwd                                 //       
    awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd      //      ,   ,     ,   ,    
    awk -F: 'NR==5{print}'  /etc/passwd                         //   5 
    awk -F: 'NR==5 || NR==6{print}'  /etc/passwd       //   5   6 
    route -n|awk 'NR!=1{print}'                                       //      
    

    3.//일치 코드 블록
    //        !//         ~//         !~//         ~/a1|a2/     a1 a2   
    awk '/mysql/' /etc/passwd
    awk '/mysql/{print }' /etc/passwd
    awk '/mysql/{print $0}' /etc/passwd                   //        
    awk '!/mysql/{print $0}' /etc/passwd                  //     mysql  
    awk '/mysql|mail/{print}' /etc/passwd
    awk '!/mysql|mail/{print}' /etc/passwd
    awk -F: '/mail/,/mysql/{print}' /etc/passwd         //    
    awk '/[2][7][7]*/{print $0}' /etc/passwd               //    27272772777...
    awk -F: '$1~/mail/{print $1}' /etc/passwd           //$1         
    awk -F: '{if($1~/mail/) print $1}' /etc/passwd     //     
    awk -F: '$1!~/mail/{print $1}' /etc/passwd          //   
    awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd        IF  
        {}()   
    awk -F: '{if($1~/mail/) print $1}' /etc/passwd                                       //  
    awk -F: '{if($1~/mail/) {print $1}}'  /etc/passwd                                   //  
    awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd            //if...else...
     
    

    4. 조건 식
    ==   !=   >   >=  
    awk -F":" '$1=="mysql"{print $3}' /etc/passwd  
    awk -F":" '{if($1=="mysql") print $3}' /etc/passwd          //      
    awk -F":" '$1!="mysql"{print $3}' /etc/passwd                 //   
    awk -F":" '$3>1000{print $3}' /etc/passwd                      //  
    awk -F":" '$3>=100{print $3}' /etc/passwd                     //    
    awk -F":" '$3<1{print $3}' /etc/passwd                            //  
    awk -F":" '$3<=1{print $3}' /etc/passwd                         //    
    

    5. 논리 연산 자
    && || 
    awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd         //   ,$1  mail,  $3>8
    awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd
    awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd       //   
    awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd 
    

    6. 수치 연산
    awk -F: '$3 > 100' /etc/passwd    
    awk -F: '$3 > 100 || $3 < 5' /etc/passwd  
    awk -F: '$3+$4 > 200' /etc/passwd
    awk -F: '/mysql|mail/{print $3+10}' /etc/passwd                    //      10   
    awk -F: '/mysql/{print $3-$4}' /etc/passwd                             //  
    awk -F: '/mysql/{print $3*$4}' /etc/passwd                             //   
    awk '/MemFree/{print $2/1024}' /proc/meminfo                  //  
    awk '/MemFree/{print int($2/1024)}' /proc/meminfo           //  
    

    7. 출력 구분자 OFS
    awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
    awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt        
    //    6  WAIT  ,        ,  45,6
     
             
        route -n|awk 'NR!=1{print > "./fs"}'   
               route -n|awk 'NR!=1{print}'  > ./fs
     
    

    8. 포맷 출력
    netstat -anp|awk '{printf "%-8s %-8s %-10s
    ",$1,$2,$3}'
    printf % -8 8 s ( 8)( 8), ( 10) netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s
    ",$1,$2,$3}'
    netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s
    ",NR,$1,$2,$3}'

    IF 문
    awk -F: '{if($3>100) print "large"; else print "small"}' /etc/passwd
    
    
    small
    small
    small
    large
    small
    small
    awk -F: 'BEGIN{A=0;B=0} {if($3>100) {A++; print "large"} else {B++; print "small"}} END{print A,"\t",B}' /etc/passwd 
                                                                                                                      //ID  100,A 1,  B 1
    awk -F: '{if($3<100) next; else print}' /etc/passwd                         //  100
    awk -F: 'BEGIN{i=1} {if(i /etc/passwd   
    awk -F: 'BEGIN{i=1} {if(i /etc/passwd
         
    awk -F: '{print ($3>100 ? "yes":"no")}'  /etc/passwd 
    awk -F: '{print ($3>100 ? $3":\tyes":$3":\tno")}'  /etc/passwd
    

    동안
    awk -F: 'BEGIN{i=1} {while(i /etc/passwd 
    7 root 1
    7 x 2
    7 0 3
    7 0 4
    7 root 5
    7 /root 6
     
    

    11. 배열
    netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) print i,"\t",a[i]}'
    netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%-20s %-10s %-5s 
    ", i,"\t",a[i]}'
    9523 1 9929 1 LISTEN 6 7903 1 3038/cupsd 1 7913 1 10837 1 9833 1

    12. 응용
      1
    awk -F: '{print NF}' helloworld.sh                                                       //           
    awk -F: '{print $1,$2,$3,$4,$5}' helloworld.sh                                 //   5   
    awk -F: '{print $1,$2,$3,$4,$5}' OFS='\t' helloworld.sh                 //   5             
    awk -F: '{print NR,$1,$2,$3,$4,$5}' OFS='\t' helloworld.sh           //        5
     
      2
    awk -F'[:#]' '{print NF}'  helloworld.sh                                                  //       : #
    awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6,$7}' OFS='\t' helloworld.sh   //          
     
      3
    awk -F'[:#/]' '{print NF}' helloworld.sh                                               //
    awk -F'[:#/]' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}' helloworld.sh     //          
     
      4
      /home   ,       ,  KB    
    ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024,"KB"}'
    ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",int(sum/1024),"KB"}'         //int      
     
      5
      netstat -anp    LISTEN CONNECT          
    netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s 
    ", i," ",sum[i]}'
    6 /home ? ls -l|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s
    ",i," ",sum[i]}'
    mysql 199 root 374 /home size ? ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf "%-6s %-5s %-3s %-2s
    ",i," ",sum[i]/1024/1024,"MB"}'
    7 awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno. Name No. Math English Computer Total
    ";printf "------------------------------------------------------------
    "}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s
    ",NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf "------------------------------------------------------------
    ";printf "%-24s %-7s %-9s %-20s
    ","Total:",math,eng,com;printf "%-24s %-7s %-9s %-20s
    ","Avg:",math/NR,eng/NR,com/NR}'
    test0 [root@localhost home]# cat test0 Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 2537 87 97 95 Bob 2415 40 57 62

    좋은 웹페이지 즐겨찾기