AWK 진급

전편 에 서 는 AWK 의 기본 적 인 사용 규칙 과 예 시 를 소개 하 였 으 며, 본 편 에 서 는 AWK 의 진급 에 관 한 지식 을 소개 하 였 다.
PATTERN 모드 가 일치 합 니 다. sed 의 주소 경계 와 유사 하여 요구 에 부 합 된 기록 을 걸 러 냅 니 다.
    (1) 기본 값 은 빈 모드 로 줄 마다 일치 합 니 다.
    (2) / regular expression /: 패턴 에 맞 는 기록 을 걸 러 내 는 정규 표현 식
        
    (3) relational expression: 관계 표현 식, 여기 결 과 는 불 값 입 니 다. '진짜' 가 있 고 '가짜' 가 있 습 니 다. 결과 가 '진짜' 여야 만 처리 합 니 다.
        이곳 의 '진' 은 결과 가 0 이 아니 거나 비어 있 는 것 이 진실 을 나타 내 고 다른 것 은 '가짜' 이다.
        예 를 들 어: 도 메 인 구분자 로 표현 식 에 맞 는 줄 을 인쇄 합 니 다.3 달러 가 30 줄 보다 작 아야 인쇄 한 다 는 뜻 입 니 다.
         
         예 를 들 어: 구분자 로 $3 이 1000 이하 이 고 마지막 도 메 인 은 문자열 / bin / bash 줄 이 며 인쇄 합 니 다.
         
    (4) 행 범위 정의
        sed, / pat 1 /, / pat 2 / 와 유사 합 니 다.
        예 를 들 어 첫 번 째 h 로 시작 하 는 줄 에서 첫 번 째 a 로 시작 하 는 줄 까지 일치 하고 인쇄 합 니 다.
         
        주의: 여 기 는 sed 처럼 직접 숫자 로 정의 할 수 없습니다.
    (5) BGEIN / END 모드
        BEGIN {} 기록 을 읽 기 전에 한 번 만 실행 합 니 다.
        END {} 텍스트 처리 완료 후 한 번 만 실행
        [root@centos7 11:18:52 ~]#awk -F: 'BEGIN{print "username       UID       
---------------------------"}$3<=1000 && $NF=="/bin/bash"{printf "%-15s%d
",$1,$3}END{print "=======================
end"}' /etc/passwd         username       UID                ---------------------------         root           0         zmh            1000         =======================         end

    (6) progranm 에서 자주 사용 하 는 action
        a.Expressions
        b. 조건 부 제어 문: if, while 등
        c. 조합 문
        d.inpue statements
        e.output statements
    (7) 제어 문
        if(condition){statments}
        if(condition){statments}else{statements}
        while(condition){statements}
        do{stetements}while(condition)
        for(expr1;expr2;expr3){statements}
        break
        continue
        delete array[index]
        delete array
        exit
제어 문
    1.if-else
        문법: if (condition) statement [else statement]
        [root@centos7 14:50:38 ~]#awk -F: '{if($3<=50&&$3!=0)print}' /etc/passwd
        bin:x:1:1:bin:/bin:/sbin/nologin
        daemon:x:2:2:daemon:/sbin:/sbin/nologin
        adm:x:3:4:adm:/var/adm:/sbin/nologin
        lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
        sync:x:5:0:sync:/sbin:/bin/sync
        shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
        halt:x:7:0:halt:/sbin:/sbin/halt
        mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        operator:x:11:0:operator:/root:/sbin/nologin
        games:x:12:100:games:/usr/games:/sbin/nologin
        ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
        rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
        gdm:x:42:42::/var/lib/gdm:/sbin/nologin
        ntp:x:38:38::/etc/ntp:/sbin/nologin
        apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
        
        [root@centos7 14:54:51 ~]#awk -F: '{if($3<=20){print $1,$3}else{print $1}}' /etc/passwd
        root 0
        bin 1
        daemon 2
        adm 3
        lp 4
        sync 5
        shutdown 6
        halt 7
        mail 8
        operator 11
        games 12
        ftp 14
        nobody
        systemd-network
        dbus
        polkitd
        abrt
        libstoragemgmt
        rpc
        
  ,  if     statements    {}   ,   if else       statement    {}   

         
        예제, 디스크 사용량 이 지정 한 값 보다 큰 디스크 를 꺼 냅 니 다.
        [root@centos7 15:09:30 ~]#df | awk -F% '/^\/dev\/sd/{print $1}' 
        /dev/sda2       52403200 3876228  48526972   8
        /dev/sda3       31441920  354300  31087620   2
        /dev/sda1        1038336  161628    876708  16
        [root@centos7 15:09:38 ~]#df | awk -F% '/^\/dev\/sd/{print $1}' | awk '{if($NF>=10)print $1,$NF}'
        /dev/sda1 16

    2. while 순환
        문법: shile (condition) statement
        조건 은 '진' 이 순환 에 들 어 가 는 것 이다.조건 은 '가짜' 종료 순환 입 니 다.첫 번 째 판단 이 '가짜' 였 다 면 순환 에 들 어가 지 않 았 을 것 이다.
        사용 장면: 한 줄 에 있 는 여러 필드 를 하나씩 처리 할 때 사용 합 니 다.배열 의 각 요 소 를 하나하나 처리 하 다.
        예 를 들 어, 통계 / opt / httpd - 2.2.34 / README 에서 문자 마다 나타 나 는 횟수 를 집계 하고 문자 와 문자 길이 (length () 함수 참조) 를 출력 합 니 다.
        [root@centos7 16:09:53 usr]#awk '{i=1;while(i 
  

    3.do-while

         :do{statment;...}while(condition) ,

         , 1..100

        [root@centos7 16:10:13 usr]#awk 'BEGIN{sum=0;i=0;do{sum+=i;i++}while(i<=100){print sum}}'
        5050
        [root@centos7 16:18:31 usr]#

    4. for 순환
        문법: for (expr 1; expr 2; expr 3) {statement;...}
        배열 요소 옮 겨 다 니 기: for (var in array) {statement}
        예 를 들 어 grub. cfg 파일 을 옮 겨 다 니 며 word [] 배열 에 저장 한 다음 배열 요 소 를 옮 겨 다 니 며 값 을 수락 합 니 다.
        [root@centos7 16:37:01 usr]#awk '{for(i=1;i<=NF;i++){word[$i]++}}END{for(j in word){print j,word[j]}}' /boot/grub2/grub.cfg 
        insmod 14
        savedefault 1
        tuned_params="" 1
        ro 2
        --hint='hd0,msdos1' 2
        boot_once=true 2
        'gnulinux-3.10.0-693.el7.x86_64-advanced-6aaae4c2-65bf-40c9-a001-8ab05ccbc30d' 1
        x"${feature_menuentry_id}" 1
        type 1
        an 1
        /etc/grub.d/41_custom 2
        after 1
        root='hd0,msdos1' 2

        예 를 들 어 서로 다른 방법 으로 1. 1000000 의 합 을 구하 고 time 으로 소모 하 는 시간 을 계산한다.
        [root@centos7 16:55:55 usr]#time (awk 'BEGIN{sum=0;for(i=0;i<=1000000;i++){sum+=i}print sum}')
        500000500000
        real 0m0.119s
        user 0m0.116s
        sys 0m0.004s
        [root@centos7 16:55:56 usr]#time (sum=0;for i in {1..1000000};do let sum+=$i;done;echo $sum)
        500000500000
        real 0m5.864s
        user 0m5.685s
        sys 0m0.174s
        [root@centos7 16:56:08 usr]#time (seq -s "+" 1 1000000|bc)
        500000500000
        real 0m0.441s
        user 0m0.280s
        sys 0m0.245s
        [root@centos7 16:56:47 usr]#

            이상 에서 알 수 있 듯 이 awk 계산 효율 은 셸 보다 훨씬 높다
    5. switch 문장
        문법: switch (expression) {case VALUE 1 or / REGEXP /: statement 1; case VALUE 2 or / REGEXP /: statement 2;...; default: statement}
    6. break 와 continue
        예시
        [root@centos7 17:09:33 usr]#awk 'BEGIN{sum=0;for(i=0;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}'
        2500
        [root@centos7 17:11:25 usr]#awk 'BEGIN{sum=0;for(i=0;i<=100;i++){if(i==88)break;sum+=i}print sum,i}'
        3828 88

    7. next: 본 줄 에 대한 처 리 를 미리 끝내 고 다음 줄 로 바로 들 어가 기 (awk 자체 순환 읽 기 줄 의 순환)
        예시
        [root@centos7 17:15:05 usr]#awk -F: '{if($3%2==1)next;print $1,$3,NR}' /etc/passwd
        root 0 1
        daemon 2 3
        lp 4 5
        shutdown 6 7
        mail 8 9
        games 12 11
        ftp 14 12
        systemd-network 192 14
        libstoragemgmt 998 18
        rpc 32 19
        saslauth 996 21
        rtkit 172 22
        nfsnobody 65534 26
        geoclue 994 29
        gdm 42 33
        gnome-initial-setup 992 34
        sshd 74 35
        avahi 70 36
        ntp 38 38
        tcpdump 72 39
        zmh 1000 40
        docker 1002 42
        base 1004 44
        testbash 1006 46
        nologin 1008 47
        apache 48 49
        user1 1010 50

awk 배열
    awk 의 배열 은 모두 관련 배열 입 니 다. array [index - expression]
    index-expression:
        (1) 임의의 문자열 을 사용 할 수 있 습 니 다.문자열 은 두 따옴표 로 묶 어야 한다.
        (2) 특정한 배열 요소 가 사전에 존재 하지 않 으 면 인용 할 때 awk 는 자동 으로 이 요 소 를 만 들 고 '빈' 으로 초기 화 합 니 다.
            배열 에 어떤 요소 가 존재 하 는 지 판단 하려 면 "index in array" 형식 으로 배열 을 옮 겨 다 닙 니 다.
        예시, array [$0] 가 사전에 존재 하지 않 습 니 다. awk 가 자동 으로 생 성하 고 값 을 비 웠 습 니 다. 다시!반전 값 을 1 로 표시 하고 기본 {print $0} 을 실행 합 니 다.
        [root@centos7 18:44:47 usr]#awk '!arr[$0]' /etc/fstab
        #
        # /etc/fstab
        # Created by anaconda on Wed Mar 28 02:08:30 2018
        #   Created by anaconda on Wed Mar 28 02:08:30 2018
        #
        # Accessible filesystems, by reference, are maintained under '/dev/disk'
        # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
        #
        UUID=6aaae4c2-65bf-40c9-a001-8ab05ccbc30d /                       xfs     defaults        0 0
        UUID=1e010872-4180-4ce5-be38-4152a4f302e5 /boot                   xfs     defaults        0 0
        UUID=66f9e8a4-7d65-4ced-8bd9-f76e5e7b97d6 /data                   xfs     defaults        0 0
        UUID=af954884-fc86-4450-9c1d-342531c53c7b swap                    swap    defaults        0 0
        /dev/sr0       /data/mnt/6/x86_64/   iso9660   defaults   0 0
        /dev/sr1       /data/mnt/7/x86_64/   iso9660   defaults   0 0
        [root@centos7 18:44:53 usr]#

        배열 의 모든 요 소 를 옮 겨 다 니 려 면 for 순환 을 사용 해 야 합 니 다.for(var in array){for-body}
        메모: var 는 array 의 모든 색인 을 옮 겨 다 닙 니 다.
        예 를 들 어 tcp 로 시작 하 는 네트워크 포트 상 태 를 선택 하고 state [] 배열 에 저장 한 다음 for 를 사용 하여 배열 을 옮 겨 다 니 며 배열 색인 (즉 포트 상태) 을 인쇄 합 니 다. 배열 요소 (즉 같은 상태 개수) 와 같 습 니 다.
        [root@centos7 18:44:53 usr]#netstat -tan | awk '/^tcp/{state[$NF]++}END {for(i in state) { print i,state[i]}}'
        LISTEN 9
        ESTABLISHED 1

awk 함수
    수치 처리 함수
        rand (): 0 과 1 사이 의 무 작위 수 를 되 돌려 줍 니 다.
        예시
        [root@centos7 18:57:55 usr]#awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'
        13
        92
        18
        63
        39
        4
        42
        12
        18
        92

    문자 처리 함수:
        length ([s]): 지정 한 문자열 의 길 이 를 되 돌려 줍 니 다.
        sub (r, s, [t]): t 문자열 에 대해 r 가 표시 하 는 패턴 과 일치 하 는 내용 을 검색 하고 첫 번 째 일치 하 는 내용 을 s 로 대체 합 니 다.
        [root@centos7 18:57:56 usr]#awk 'sub(/:/,"---",$1)' /etc/passwd
        root---x:0:0:root:/root:/bin/bash
        bin---x:1:1:bin:/bin:/sbin/nologin
        daemon---x:2:2:daemon:/sbin:/sbin/nologin
        adm---x:3:4:adm:/var/adm:/sbin/nologin
        lp---x:4:7:lp:/var/spool/lpd:/sbin/nologin
        sync---x:5:0:sync:/sbin:/bin/sync
        
        [root@centos7 19:02:17 usr]#awk 'gsub(/:/,"---",$1)' /etc/passwd
        root---x---0---0---root---/root---/bin/bash
        bin---x---1---1---bin---/bin---/sbin/nologin
        daemon---x---2---2---daemon---/sbin---/sbin/nologin
        adm---x---3---4---adm---/var/adm---/sbin/nologin
        lp---x---4---7---lp---/var/spool/lpd---/sbin/nologin
        sync---x---5---0---sync---/sbin---/bin/sync

    gsub (r, s, [t]): t 문자열 에 대해 r 가 표시 하 는 패턴 과 일치 하 는 내용 을 검색 하고 모두 s 가 표시 하 는 내용 으로 대체 합 니 다.
    split (s, array, [r]): r 를 구분자 로 하고 문자열 s 를 절단 하 며 절 단 된 결 과 를 array 가 표시 하 는 배열 에 저장 합 니 다. 첫 번 째 색인 값 은 1 이 고 두 번 째 색인 값 은 2 입 니 다.
        예시
        [root@centos7 19:06:50 usr]#netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
        192.168.30.1 1
        0.0.0.0 4

    사용자 정의 함수
    형식:    function name ( parameter, parameter,...){        statements
        return expression    } 
    예: a, b 의 크기 비교        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
    awk -f fun.awk
    예 를 들 어 남자 (m) 의 평균 성적, 여자 (f) 의 평균 성적 을 구한다.
    [root@centos7 19:15:56 bin]#cat score.txt 
    leifeng 100 m
    lilei 99 m
    limengmeng 90 f
    han××× 100 f
    [root@centos7 19:16:07 bin]#awk '{num[$NF]++;sum[$NF]+=$2 }END{for(sex in num)printf "%s:%.2f
",sex,sum[sex]/num[sex]}' score.txt     m:99.50     f:95.00     [root@centos7 19:16:09 bin]#

awk 에서 셸 명령 호출
    시스템 명령, 빈 칸 은 awk 의 문자열 연결 문자 입 니 다. 시스템 에서 awk 의 변 수 를 사용 해 야 한다 면 빈 칸 으로 구분 하거나 awk 변 수 를 제외 한 다른 변 수 는 일률적으로 "참조" 를 사용 할 수 있 습 니 다.
    예시
    [root@centos7 19:16:09 bin]#awk 'BEGIN{score=100; system("echo your score is " score) }'
    your score is 100

awk 스 크 립 트 에 인자 전달
    형식:        awkfile var=value var2=value2... Inputfile    메모: BEGIN 과정 에서 사용 할 수 없습니다. 첫 줄 의 입력 이 끝 난 후에 야 변 수 를 사용 할 수 있 습 니 다. - v 매개 변 수 를 통 해 awk 가 BEGIN 을 실행 하기 전에 변 수 를 가 져 올 수 있 습 니 다. 명령 줄 에 지정 한 변 수 는 각각 - v 매개 변수 가 필요 합 니 다.    예시
        [root@centos7 19:25:23 bin]#cat test.awk 
        #!/bin/awk -f 
        {if($3 >=min && $3<=max)print $1,$3}
        [root@centos7 19:25:26 bin]#chmod +x test.awk 
        [root@centos7 19:25:31 bin]#test.awk -F: min=100 max=200 /etc/passwd
        systemd-network 192
        abrt 173
        rtkit 172
        qemu 107
        usbmuxd 113
        pulse 171
        [root@centos7 19:25:33 bin]#

좋은 웹페이지 즐겨찾기