01 - 09 리 눅 스 삼 총사 - awk

5283 단어 링크 ux 테스트
정의.
파일 을 한 줄 씩 읽 고 빈 칸 을 기본 분할 문자 로 하여 각 줄 을 자 르 고 자 른 부분 을 후속 처리 합 니 다.
처리 절차:
형식: awk [ ] 'pattern action' [ ]
  • pattern: 정규 표현 식
  • action: 일치 하 는 내용 에 대한 명령 (기본 값 은 줄 당 내용 입력)
  • 상용 매개 변수:
  • FILENAME: awk 탐색 한 파일 이름
  • BEGIN: 텍스트 를 처리 하기 전에 실행 할 작업
  • END: 텍스트 를 처리 한 후 실행 할 동작
  • FS: 입력 도 메 인 분할 부 를 설정 하고 명령 행 -F 파라미터
  • 와 같 습 니 다.
  • NF: 기 록 된 도 메 인 을 탐색 하 는 개수 (열 수)
  • NR: 읽 은 기록 수 (줄 수)
  • OFS: 출력 영역 분할 문자
  • ORS: 기록 분할 자 입력
  • RS: 제어 기록 분할 부호
  • $0: 전체 기록
  • $n: 현재 줄 의 n 번 째 도 메 인
  • 을 나타 낸다.
    실전 응용
  • 검색 /etc/passwd 파일 에 루트 키 워드 를 포함 하 는 모든 줄 을 포함 하고 해당 하 는 셸
  • 을 인쇄 합 니 다.
    $ cat /etc/passwd | head -2
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    $ awk -F : '/root/{print $0}' /etc/passwd  # $0:    
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    $ awk -F : '/root/{print $7}' /etc/passwd
    /bin/bash
    /sbin/nologin
  • 인쇄 /etc/passwd 파일 두 번 째 줄 의 정보
  • $ awk -F : 'NR==2{print $0}' /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin
  • 사용 BEGIN 제목 추가
  • $ awk -F : 'BEGIN {print "  "} {print $1 $2}' /etc/passwd | head -5
      
    rootx
    binx
    daemonx
    admx
  • 자체 정의 행 분할 부
  • $ echo "111 222|333 444|555 666" | awk 'BEGIN{RS="|"}{print $0}'
    111 222
    333 444
    555 666

    과정 실전 응용
  • log 중의 404, 500 의 오 류 를 찾 아 라.
  • $ cat nginx.log | head -3
    223.104.7.59 - - [05/Dec/2018:00:00:01 +0000] "GET /topics/17112 HTTP/2.0" 200 9874 "https://www.googleapis.com/auth/chrome-content-suggestions" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/70.0.3538.75 Mobile/15E148 Safari/605.1" 0.040 0.040 .
    $ less nginx.log | awk '$9~/404|500/'
    #     
    $ less nginx.log | awk '$9~/404|500/'|awk '{print $9}'|sort|uniq -c
        266 404
          1 500
  • 방 문 량 이 가장 많은 IP
  • 을 찾 아 라.
    $ less nginx.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -3
        282 216.244.66.241
        130 136.243.151.90
        110 127.0.0.1
  • 실 용적 인 기법: 절단 후 각 필드 는 몇 번 째 열
  • 에 대응 합 니 다.
    $ less nginx.log | head -1 | awk '{for(i=1;i<=NF;i++) print "$"i" = "$i}'
    $1 = 223.104.7.59
    $2 = -
    $3 = -
    $4 = [05/Dec/2018:00:00:01
    $5 = +0000]
    $6 = "GET
    $7 = /topics/17112
    $8 = HTTP/2.0"
    $9 = 200
    $10 = 9874
    $11 = "https://www.googleapis.com/auth/chrome-content-suggestions"
    $12 = "Mozilla/5.0
    $13 = (iPhone;
    $14 = CPU
    $15 = iPhone
    $16 = OS
    $17 = 12_1
    $18 = like
    $19 = Mac
    $20 = OS
    $21 = X)
    $22 = AppleWebKit/605.1.15
    $23 = (KHTML,
    $24 = like
    $25 = Gecko)
    $26 = CriOS/70.0.3538.75
    $27 = Mobile/15E148
    $28 = Safari/605.1"
    $29 = 0.040
    $30 = 0.040
    $31 = .
  • 최대 응답 시간 추출
  • $ less nginx.log | awk '{print $(NF-1)}' | sort -nr | head -1
    86462.600
  • 응답 시간 top3 을 꺼 내 고 해당 하 는 인터페이스
  • 를 출력 합 니 다.
    $ less nginx.log | awk '{print $(NF-1), $7}' | sort -nr | head -3
    86462.600 /cable
    77331.425 /cable
    59394.978 /cable
  • 모든 요청 의 평균 추출
  • $ less nginx.log | awk '{sum+=$(NF-1)}END{print sum/NR}'
    1082.57
  • 각 인터페이스의 평균 응답 시간 을 계산 하고 꺼 내기 top3
  • $ less nginx.log | awk '{time[$7]+=$(NF-1); count[$7]+=1}END{for(k in time) print time[k]/count[k], k}'| sort -nr | head -3
    3707.26 /cable
    5.592 /topics/9524
    2.19 /topics/8343?locale=en
  • URL 의 최상 위 경로 주소 에 대응 하 는 QPS (초당 요청 횟수) 를 계산 하고 인쇄 top5 의 최상 위 경로
  • less nginx.log | 
      awk '{print $4,$7}' | 
      sed 's#[?!].*##' |
      sed -E 's#([^ ]*) *(/[^/]*).*#\1:\2#'  |
      sort | 
      awk -F: '
    {cur=($3*60+$4);}
    NR==1{min=cur; max=cur;}
    NR>1{
    count[$NF]+=1; 
    if(curmax) max=cur;
    }
    END{
    for(k in count) print k,count[k]/(max-min+1)}
    ' | 
      sort -k2 -nr | head -5
  • 1 초 간격 으로 aliyundun 의 2 개 프로 세 스 cpu 와 메모 리 를 집계 하고 10s 내의 평균 cpu 과 응답 시간
  • 을 분류 합 니 다.
    $ top -b -d 1 -n 10 | grep -i aliyundun | awk '{cpu[$NF]+=$(NF-3);mem[$NF]+=$(NF-2);count[$NF]+=1}END{for(k in cpu) print k, cpu[k]/count[k], mem[k]/count[k]}'
    AliYunDunUpdate 0 0.1
    AliYunDun 0.8 1.2
  • 현재 서버 의 모든 감청 포트 에 대응 하 는 네트워크 상태의 수량
  • 을 통계 합 니 다.
    $ netstat -tn | awk '{print $4, $NF}' | awk -F: '{print $NF}' | sort | uniq -c
         15 22 ESTABLISHED
          3 25 TIME_WAIT
          1 51368 TIME_WAIT
          1 51374 TIME_WAIT
          1 51380 TIME_WAIT
          1 51386 TIME_WAIT
          1 57968 ESTABLISHED
          4 9101 TIME_WAIT
          1 9102 ESTABLISHED
          1 Local State
          1 (w/o servers)

    좋은 웹페이지 즐겨찾기