21. Linux awk 명령

13723 단어
AWK 공식 매 뉴 얼:http://www.gnu.org/software/gawk/manual/gawk.html
awk 는 강력 한 텍스트 분석 도구 로 grep 의 검색, sed 의 편집 에 비해 awk 는 데이터 분석 과 보고 서 를 생 성 할 때 특히 강하 다.쉽게 말 하면 awk 는 파일 을 한 줄 씩 읽 고 빈 칸 을 기본 구분자 로 하여 각 줄 을 자 르 고 자 른 부분 을 여러 가지 분석 처리 하 는 것 입 니 다.
awk 는 3 가지 버 전이 있 습 니 다. awk, nawk, gawk 는 특별한 설명 을 하지 않 았 습 니 다. 일반적으로 gawk 를 말 합 니 다. gawk 는 AWK 의 GNU 버 전 입 니 다.
awk 의 이름 은 창시자 인 Alfred Aho, Peter Weinberger 와 Brian Kernighan 성씨 의 첫 글자 에서 나 왔 다.실제로 AWK 는 자신의 언어 를 가지 고 있 습 니 다. AWK 프로 그래 밍 언어 입 니 다. 세 명의 작성 자 는 이 를 '스타일 스 캔 과 처리 언어' 로 정식 적 으로 정의 하 였 습 니 다.간단 한 프로그램 을 만 들 수 있 습 니 다. 이 프로그램 들 은 입력 파일 을 읽 고 데이터 정렬, 데 이 터 를 처리 하 며 입력 에 대한 계산 과 보고 서 를 만 들 수 있 습 니 다. 그리고 수많은 다른 기능 도 있 습 니 다.
문법
awk [    ] 'script' var=value file(s)
 
awk [    ] -f scriptfile var=value file(s)

awk 호출
awk 를 호출 하 는 세 가지 방법 이 있 습 니 다.
1.     
awk [-F  field-separator]  'commands'  input-file(s)
  ,commands    awk  ,[-F    ]    。 input-file(s)        。
 awk ,       ,                。  ,    -F        ,          。

2.shell    
    awk        ,  awk     ,  awk            ,             。
   shell     :#!/bin/sh
    :#!/bin/awk

3.    awk          ,    :
awk -f awk-script-file input-file(s)
  ,-f    awk-script-file  awk  ,input-file(s)        。


기본 용법
log. txt 텍스트 내용 은 다음 과 같 습 니 다.
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

사용법 1:
awk '{pattern + action}' {filenames} 

비록 조작 이 복잡 할 수 있 지만 문법 은 항상 이 렇 습 니 다. 그 중에서 pattern 은 AWK 가 데이터 에서 찾 은 내용 을 나타 내 고 action 은 일치 하 는 내용 을 찾 을 때 실 행 된 일련의 명령 입 니 다.괄호 ({}) 는 프로그램 에서 항상 나타 날 필요 가 없 지만 특정한 패턴 에 따라 일련의 명령 을 그룹 으로 나 누 는 데 사 용 됩 니 다.pattern 은 정규 표현 식 을 나타 내 고 평행봉 으로 묶는다.
awk 언어의 가장 기본 적 인 기능 은 파일 이나 문자열 에서 지정 한 규칙 을 바탕 으로 정 보 를 탐색 하고 추출 하 는 것 입 니 다. awk 에서 정 보 를 추출 한 후에 야 다른 텍스트 작업 을 할 수 있 습 니 다.전체 awk 스 크 립 트 는 보통 텍스트 파일 의 정 보 를 포맷 하 는 데 사 용 됩 니 다.
일반적으로 awk 는 파일 의 행동 처리 단위 입 니 다.awk 는 파일 의 한 줄 을 받 을 때마다 해당 명령 을 실행 하여 텍스트 를 처리 합 니 다.
실례:
#       TAB  ,      1、4  ( 0     )
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 #   awk+action   ,      action{print $1,$4}。
 
 
#      
 $ awk '{printf "%-8s %-10s
",$1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo

awk 작업 프로 세 스 는 다음 과 같 습 니 다. '줄 바 꿈 문자 분할 기록 을 읽 은 다음 에 기록 을 지정 한 도 메 인 구분자 에 따라 도 메 인 을 구분 하고 도 메 인 을 채 웁 니 다. $0 은 모든 도 메 인 을 표시 합 니 다. $1 은 첫 번 째 도 메 인 을 표시 하고 $n 은 n 번 째 도 메 인 을 표시 합 니 다.기본 도 메 인 구분자 가 '공백 키' 나 '[tab] 키' 입 니 다.
print 와 printf awk 에 서 는 print 와 printf 두 가지 인쇄 출력 함 수 를 동시에 제공 합 니 다.
그 중에서 print 함수 의 인 자 는 변수, 수치 또는 문자열 일 수 있 습 니 다.문자열 은 따옴표 로 인용 해 야 합 니 다. 매개 변 수 는 쉼표 로 구 분 됩 니 다.쉼표 가 없 으 면 매개 변 수 는 한데 연결 되 어 구분 할 수 없다.여기 서 쉼표 의 역할 은 출력 파일 의 구분자 역할 과 같 으 며 후 자 는 빈 칸 일 뿐이다.
printf 함수, 그 용법 은 c 언어 에서 printf 와 기본적으로 비슷 합 니 다. 문자열 을 포맷 할 수 있 습 니 다. 출력 이 복잡 할 때 printf 가 더 좋 고 코드 가 더 알 기 쉽 습 니 다.
용법 2:
awk -F  #-F       FS,       

실례:
#   ","  
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 
#         
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 
#        .       ,          ","  
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

#  /etc/passwd         shell,    shell   tab   
#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh

용법 3:
awk -v  #     

실례:
$ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 
$ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

용법 4:
awk -f {awk  } {   }

실례:
$ awk -f cal.awk log.txt

연산 자
                                                  

= += -= *= /= %= ^= **=                              
?:                                              C     
||                                                   
&&                                                   
~ ~!                                                      
< <= > >= != ==                                      
                                                    
+ -                                                , 
* / %                                           ,    
+ - !                                           ,     
^ ***                                                 
++ --                                          ,       
$                                                      
in                                                     

첫 번 째 열 이 2 이상 인 줄 을 걸 러 냅 니 다.
$ awk '$1>2' log.txt    #  
#  
3 Are you like awk
This's a test
10 There are orange,apple,mongo

첫 번 째 열 이 2 인 줄 을 걸 러 냅 니 다.
$ awk '$1==2 {print $1,$3}' log.txt    #  
#  
2 is

첫 번 째 열 이 2 보다 크 고 두 번 째 열 이 'are' 와 같은 줄 을 걸 러 냅 니 다.
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #  
#  
3 Are you

내장 변수
                                     
\$n                           n   ,    FS  
\$0                            
ARGC                            
ARGIND                             ( 0   )
ARGV                            
CONVFMT                       (    %.6g)ENVIRON        
ERRNO                              
FIELDWIDTHS                   (      )
FILENAME                     
FNR                               ( awk           ,          ,NR    1  ,      ,      FNR,            ,FNR  1    ,FNR     File Number of Record。)
FS                           (       ) (   /     ,FS      , FS     ,awk          ,       。RS     

FS 。) IGNORECASE , NF ( ,NF Number of Field。) NR , , 1 ( awk , , , ,NR Number of Record 。) OFMT ( %.6g) OFS ( ), ( 。) ORS ( )( , ORS RS , ) RLENGTH match RS ( )( ,RS ,RT RS , RS ,RT RS 。 RS ,awk 。) RS,ORS,FS,OFS :http://blog.51yip.com/shell/1151.html RSTART match SUBSEP ( /034)

실례:
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s
","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------
"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s
",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt FILENAME ARGC FNR FS NF NR OFS ORS RS --------------------------------------------- log.txt 2 1 5 1 log.txt 2 2 5 2 log.txt 2 3 3 3 log.txt 2 4 4 4 $ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s
","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------
"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s
",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt FILENAME ARGC FNR FS NF NR OFS ORS RS --------------------------------------------- log.txt 2 1 ' 1 1 log.txt 2 2 ' 1 2 log.txt 2 3 ' 2 3 log.txt 2 4 ' 1 4 # NR, $ awk '{print NR,FNR,$1,$2,$3}' log.txt --------------------------------------------- 1 1 2 this is 2 2 3 Are you 3 3 This's a test 4 4 10 There are # $ awk '{print $1,$2,$5}' OFS=" $ " log.txt --------------------------------------------- 2 $ this $ test 3 $ Are $ awk This's $ a $ 10 $ There $

정규, 문자열 일치 사용
#         "th",          
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

모드 시작모드
#     "re"   
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

대소 문자 무시
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test

모드 반전
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
Are like
a
There orange,apple,mongo

$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo

awk 스 크 립 트
awk 스 크 립 트 에 대해 서 는 두 가지 키워드 인 BEGIN 과 END 에 주의해 야 합 니 다.
  • BEGIN {이 안 에는 실행 전 문구 가 들 어 있 습 니 다}
  • END {이 안 에는 모든 줄 을 처리 한 후 실행 할 문구 가 들 어 있 습 니 다}
  • {이 안 에는 각 줄 을 처리 할 때 실행 할 문구 가 들 어 있 습 니 다}
  • 만약 에 이런 파일 이 있다 고 가정 하면 (학생 성적 표):
    $ cat score.txt
    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
    

    우리 awk 스 크 립 트 는 다음 과 같 습 니 다:
    $ cat cal.awk
    #!/bin/awk -f
    #   
    BEGIN {
        math = 0
        english = 0
        computer = 0
     
        printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
    " printf "---------------------------------------------
    " } # { math+=$3 english+=$4 computer+=$5 printf "%-6s %-6s %4d %8d %8d %8d
    ", $1, $2, $3,$4,$5, $3+$4+$5 } # END { printf "---------------------------------------------
    " printf " TOTAL:%10d %8d %8d
    ", math, english, computer printf "AVERAGE:%10.2f %8.2f %8.2f
    ", math/NR, english/NR, computer/NR }

    awk 작업 프로 세 스 는 다음 과 같 습 니 다. 먼저 BEGING 을 실행 한 다음 에 파일 을 읽 고 / n 줄 바 꿈 문자 로 분 단 된 기록 을 읽 은 다음 에 기록 을 지정 한 도 메 인 구분자 에 따라 도 메 인 을 나 누고 도 메 인 을 채 웁 니 다. $0 은 모든 도 메 인 을 표시 합 니 다. $1 은 첫 번 째 도 메 인 을 표시 하고 $n 은 n 번 째 도 메 인 을 표시 한 다음 에 모드 에 대응 하 는 동작 action 을 실행 합 니 다.이 어 두 번 째 기록 을 읽 기 시 작 했 습 니 다.
    집행 결 과 를 살 펴 보 자.
    $ awk -f cal.awk score.txt
    NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
    ---------------------------------------------
    Marry  2143     78       84       77      239
    Jack   2321     66       78       45      189
    Tom    2122     48       77       71      196
    Mike   2537     87       97       95      279
    Bob    2415     40       57       62      159
    ---------------------------------------------
      TOTAL:       319      393      350
    AVERAGE:     63.80    78.60    70.00
    

    조건문
    awk 의 조건 문 구 는 C 언어 에서 참고 한 것 으로 다음 과 같은 성명 방식 을 보십시오.
    if (expression) {
        statement;
        statement;
        ... ...
    }
    
    if (expression) {
        statement;
    } else {
        statement2;
    }
    
    if (expression) {
        statement1;
    } else if (expression1) {
        statement2;
    } else {
        statement3;
    }
    

    어떤 폴 더 의 파일 이 차지 하 는 바이트 수 를 통계 하고 4096 크기 의 파일 을 걸 러 냅 니 다 (일반적으로 폴 더 입 니 다).
    ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' 
    [end]size is  8.22339 M
    

    순환 문
    awk 의 순환 문 구 는 C 언어 를 감안 하여 while, do / while, for, break, contine 을 지원 합 니 다. 이러한 키워드 의 의 미 는 C 언어 중의 의미 와 완전히 같 습 니 다.
    배열
    awk 에서 배열 의 아래 표 지 는 숫자 와 알파벳 일 수 있 기 때문에 배열 의 아래 표 지 는 보통 키워드 (key) 라 고 불 린 다.값 과 키 워드 는 키 / value 를 위 한 hash 표 에 저 장 됩 니 다.hash 는 순서대로 저장 되 지 않 기 때문에 배열 의 내용 을 표시 할 때 예상 한 순서대로 표시 되 지 않 는 다 는 것 을 알 수 있 습 니 다.배열 은 변수 와 마찬가지 로 사용 할 때 자동 으로 만들어 집 니 다. awk 도 숫자 인지 문자열 인지 자동 으로 판단 합 니 다.일반적으로 awk 의 배열 은 기록 에서 정 보 를 수집 하 는 데 사용 되 며, 총화, 통계 단어, 추적 템 플 릿 이 일치 하 는 횟수 등 을 계산 하 는 데 사용 된다.
    / etc / passwd 계 정 보이 기
    awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
    0 root
    1 daemon
    2 bin
    3 sys
    4 sync
    5 games
    ......
    

    여기 서 배열 순환 을 위해 사용 합 니 다.
    다른 실례
    AWK 의 hello World 프로그램 은 다음 과 같 습 니 다.
    BEGIN { print "Hello, world!" }
    

    파일 크기 계산
    $ ls -l *.txt | awk '{sum+=$5} END {print sum}'
    --------------------------------------------------
    666581
    

    파일 에서 길이 가 80 이상 인 줄 을 찾 아 라.
    awk 'length>80' log.txt
    

    구구 곱셈 표를 인쇄 하 다
    seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"
    ":"\t")}'

    좋은 웹페이지 즐겨찾기