awkawk 시작하기


비고

AWK라는 이름은 제작자 Alfred V. Aho, Peter J. Weinberger의 마지막 이니셜에서 비롯됩니다.
Brian W. Kernighan.

자원

버전

이름 초기 버전 번역 출시일
POSIX awk 1992 년 IEEE Std 1003.1, 2013 Edition 2013-04-19
하나의 True Awk 또는 Nawk 또는 BWK awk 198X - 2012-12-20
GNU awk 또는 gawk 1986 4.1.3 2015-05-19

예제에 의한 AWK

AWK는 주로 UNIX 시스템에서 사용되는 문자열 조작 언어입니다. AWK의 기본 개념은 너무 복잡하지 않은 파일 작업을 할 때 사용할 다양한 언어를 만드는 것이 었습니다.

AWK에는 몇 가지 다른 변형이 있지만 기본 개념은 추가 기능과 동일합니다. 이러한 다른 변형은 NAWK 및 GAWK입니다. GAWK에는 두 가지 기능이 모두 포함되어 있으며, NAWK는 AWK보다 한 단계 위입니다.

AWK를 생각하는 가장 간단한 방법은 두 가지 주요 부분이 있다고 생각하는 것입니다. 패턴과 행동.

아마도 AWK의 가장 기본적인 예제가 될 것입니다 : (Hello World 참조)

BEGIN {print "START"}
      {print        }
END   {print "STOP" }
 

여기서 키워드는 BEGINEND 이며 패턴은 {} 안에 있습니다. 이 예제는 쓸모가 없지만 실제로 유용한 함수로 만들려면 사소한 변경 만 수행하면됩니다.

BEGIN {print "File\tAuthor"}
      {print $8, "\t", $3}
END {print " - DONE - "}
 

여기에서 \t 는 Tab 문자를 나타내며 출력 행 경계를 위로 올리는 데 사용됩니다. $ 8과 $ 3은 Shell Scripts 에서 사용 된 것과 유사하지만 3 번째와 8 번째 인수를 사용하는 대신 입력 행의 3 번째와 8 번째 열을 사용합니다.

따라서이 예제는 맨 위 줄에 File Author를, 두 번째 줄에는 파일 경로를 사용하여 인쇄합니다. $ 8은 파일의 이름이고, $ 3은 소유자입니다 (디렉토리 경로를 보면 더 명확합니다). 마지막으로, 기대했던대로 최종선이 인쇄됩니다 - 완료 -

위 예에 대한 크레딧은 http://www.grymoire.com/Unix/Awk.html 로 이동합니다 .

참조 파일

Greg Goebel의 coins.txt :

gold     1    1986  USA                 American Eagle
gold     1    1908  Austria-Hungary     Franz Josef 100 Korona
silver  10    1981  USA                 ingot
gold     1    1984  Switzerland         ingot
gold     1    1979  RSA                 Krugerrand
gold     0.5  1981  RSA                 Krugerrand
gold     0.1  1986  PRC                 Panda
silver   1    1986  USA                 Liberty dollar
gold     0.25 1986  USA                 Liberty 5-dollar piece
silver   0.5  1986  USA                 Liberty 50-cent piece
silver   1    1987  USA                 Constitution dollar
gold     0.25 1987  USA                 Constitution 5-dollar piece
gold     1    1988  Canada              Maple Leaf
 

최소 이론

일반 awk one-liner :

awk <awk program> <file>
 

또는:

<shell-command> | awk <awk program> 
 

<shell-command><file>awk 입력으로 처리 됩니다.

<awk program> 은이 템플릿 다음에 나오는 코드입니다 (따옴표가 아닌 단일 따옴표).

'BEGIN   {<init actions>};
 <cond1> {<program actions>};
 <cond2> {<program actions>};
 ...
 END  {<final actions>}'
 

어디에:

  • <condX> 조건은 awk 입력 행과 일치하는 가장 일반적인 표현식 /re/ .
  • <* actions> 는 C와 유사한 구조가있는 쉘 명령과 유사한 일련의 명령문 입니다.

``는 다음 규칙에 따라 처리됩니다.
  1. BEGIN ...END ... 는 선택 사항이며 awk 입력 행 처리 전후에 실행됩니다.
  2. awk 입력의 각 행에 대해 <condN> 조건이 고기 인 경우 관련 <program actions> 블록이 실행됩니다.
  3. {<program actions>} 기본값은 {print $0} 입니다.

조건 은 표준 논리 연산자와 결합 할 수 있습니다.

    /gold/ || /USA/ && !/1986/
 

여기서 &&|| 보다 우선합니다. ;

print . print item1 item2 문을 인쇄하면 STDOUT에 항목이 인쇄됩니다.
항목은 변수 ( X , $0 ), 문자열 ( "hello") 또는 숫자가 될 수 있습니다.
item1, item2OFS 변수의 값과 대조됩니다.
item1 item2 가 justapoxed 있습니다 ! 공백은 item1 " " item2 를 사용하고 다른 기능은 printf를 사용하십시오.

변수$ 필요로하지 않습니다. 예 : print myVar;
awk에는 다음과 같은 특수 변수가 내장되어 있습니다.

  • FS : 필드에서 awk 입력 행을 분리하는 필드 분리 자로 사용됩니다. 나는 FS="c" 라는 단일 문자가 될 수있다. null 문자열, FS="" (각 개별 문자는 별도의 필드가됩니다); 슬래시가없는 정규식, FS="re" ; FS=" " 는 공백과 탭의 실행을 나타내며 기본값입니다.
  • NF : 읽을 필드 수.
  • $1 , $2 , ... : 첫 번째 필드, 두 번째 필드. 현재 입력 라인의 "
  • $0 : 현재 입력 행;
  • NR : 현재 줄 번호를 입력하십시오.
  • OFS : 인쇄 할 때 필드를 조합하는 문자열.
  • ORS : 출력 레코드 분리 기호, 기본적으로 개행 문자.
  • RS : 라인 (레코드) 구분 기호를 입력하십시오. 기본값은 개행 문자입니다. FS 설정하십시오.
  • IGNORECASE : FS와 RS에 영향을 미칩니다.

예제들

regexp gold 줄을 필터링하고 개수를 계산합니다.

# awk 'BEGIN {print "Coins"} /gold/{i++; print $0}  END {print i " lines out of " NR}' coins.txt
Coins
gold     1    1986  USA                 American Eagle      
gold     1    1908  Austria-Hungary     Franz Josef 100 Korona 
gold     1    1984  Switzerland         ingot 
gold     1    1979  RSA                 Krugerrand 
gold     0.5  1981  RSA                 Krugerrand 
gold     0.1  1986  PRC                 Panda                       
gold     0.25 1986  USA                 Liberty 5-dollar piece
gold     0.25 1987  USA                 Constitution 5-dollar piece
gold     1    1988  Canada              Maple Leaf
9 lines out of 13
 

기본 print $0 내부 awk 변수에 기반한 동작 및 조건 NR :

# awk 'BEGIN {print "First 3 coins"} NR<4' coins.txt
First 3 coins                                                  
gold     1    1986  USA                 American Eagle         
gold     1    1908  Austria-Hungary     Franz Josef 100 Korona 
silver  10    1981  USA                 ingot
 
C 스타일`printf`로 포맷팅하기 :
# awk '{printf ("%s \t %3.2f\n", $1, $2)}' coins.txt
gold     1.00                                      
gold     1.00                                      
silver   10.00                                     
gold     1.00                                      
gold     1.00                                      
gold     0.50                                      
gold     0.10                                      
silver   1.00                                      
gold     0.25                                      
silver   0.50                                      
silver   1.00                                      
gold     0.25                                      
gold     1.00
 

조건 예제

awk 'NR % 6'            # prints all lines except those divisible by 6
awk 'NR > 5'            # prints from line 6 onwards (like tail -n +6, or sed '1,5d')
awk '$2 == "foo"'       # prints lines where the second field is "foo"
awk '$2 ~ /re/'         # prints lines where the 2nd field mateches the regex /re/
awk 'NF >= 6'           # prints lines with 6 or more fields
awk '/foo/ && !/bar/'   # prints lines that match /foo/ but not /bar/
awk '/foo/ || /bar/'    # prints lines that match /foo/ or /bar/ (like grep -e 'foo' -e 'bar')
awk '/foo/,/bar/'       # prints from line matching /foo/ to line matching /bar/, inclusive
awk 'NF'                # prints only nonempty lines (or: removes empty lines, where NF==0)
awk 'NF--'              # removes last field and prints the line
 

액션을 추가하면 {...} 전체 라인이 아닌 특정 필드를 인쇄 할 수 있습니다. 예 :

awk '$2 ~ /re/{print $3 " " $4}'
 

두 번째 필드가 regex / re /를 매치하는 줄의 세 번째와 네 번째 필드를 출력합니다.

일부 문자열 함수

substr() 함수 :

# awk '{print substr($3,3) " " substr($4,1,3)}' 
86 USA                                            
08 Aus                                            
81 USA                                            
84 Swi                                            
79 RSA                                            
81 RSA                                            
86 PRC                                            
86 USA                                            
86 USA                                            
86 USA                                            
87 USA                                            
87 USA                                            
88 Can                                            
 

match(s, r [, arr])s 에서 정규식 r 발생하는 위치를 반환하고 RSTARTRLENGTH 의 값을 설정합니다. 인수 arr 이 제공되면 요소 arr 이 배열 괄호로 묶인 하위 표현식에 설정된 배열 arr 반환합니다. arr 의 0 번째 요소 일치는 전체 정규식 일치로 설정됩니다. 또한 표현식 arr[n, "start"]arr[n, "length"] 는 일치하는 각 하위 문자열의 시작 위치와 길이를 제공합니다.

더 많은 문자열 기능 :

sub(/regexp/, "newstring"[, target])
gsub(/regexp/, "newstring"[, target])
toupper("string")
tolower("string")
 

진술

간단한 진술은 종종 다음 중 하나입니다.

variable = expression 
print [ expression-list ] 
printf format [ , expression-list ] 
next # skip remaining patterns on this input line
exit # skip the rest of the input
 

stat1stat2 가 명령문 인 경우, 다음도 명령문입니다.

{stat}

{stat1;  stat2}

{stat1 
stat2}

if ( conditional ) statement [ else statement ]
 

다음 표준 C와 같은 구문은 구문입니다.

if ( conditional ) statement [ else statement ]
while ( conditional ) statement
for ( expression ; conditional ; expression ) statement
break    # usual C meaning 
continue # usual C meaning 
 

필드 4부터 시작하여 가변 길이 설명 요소를 인쇄하는 C 스타일 루프입니다.

# awk '{out=""; for(i=4;i<=NF;i++){out=out" "$i}; print out}' coins.txt
USA American Eagle                    
Austria-Hungary Franz Josef 100 Korona
USA ingot                             
Switzerland ingot                     
RSA Krugerrand                        
RSA Krugerrand                        
PRC Panda                             
USA Liberty dollar                    
USA Liberty 5-dollar piece            
USA Liberty 50-cent piece             
USA Constitution dollar               
USA Constitution 5-dollar piece       
Canada Maple Leaf
 

i 는 0으로 초기화됩니다.

수질 분야에 적용되는 조건과 계산 :

# awk '/gold/ {if($3<1980) print $0 "$" 425*$2}' coins.txt    
gold     1    1908  Austria-Hungary     Franz Josef 100 Korona      $425
gold     1    1979  RSA                 Krugerrand                  $425   
 

AWK 실행 스크립트

#!/usr/bin/gawk -f
# This is a comment
(pattern) {action}
...
 

쉘 변수 전달하기

# var="hello"
# awk -v x="$var" 'BEGIN {print x}'
hello
 

안녕 세상

Hello world 예제는 다음과 같이 간단합니다.

awk 'BEGIN {print "Hello world"}'
 

가장 기본적인 awk 프로그램은 참 값 (일반적으로 1 )으로 구성되며 awk 는 입력을 echo합니다.

$ date | awk '1'
Mon Jul 25 11:12:05 CEST 2016
 

"안녕하세요 세상"또한 진정한 가치이기 때문에 다음과 같이 말할 수도 있습니다.

$ date | awk '"hello world"'
Mon Jul 25 11:12:05 CEST 2016
 

그러나 글을 쓰면 의도가 훨씬 명확 해집니다.

$ date | awk '{print}'
Mon Jul 25 11:12:05 CEST 2016
 

대신.

AWK 프로그램을 실행하는 방법

프로그램이 짧으면 awk를 실행하는 명령에 포함시킬 수 있습니다.

awk -F: '{print $1, $2}' /etc/passwd
 

이 예제에서, 명령 행 스위치 -F: 를 사용하여 awk가 입력 필드 구분 기호로 :를 사용할 것을 권장합니다. 동일하다.

awk 'BEGIN{FS=":"}{print $1,$2}' file
 

다른 방법으로, 우리는 awk 파일에 전체 awk 코드를 저장하고 다음과 같이 awk 프로그램을 호출 할 수 있습니다.

awk -f 'program.awk' input-file1 input-file2 ...
 

program.awk는 여러 줄 프로그램이 될 수 있습니다. 즉 :

# file print_fields.awk
BEGIN {print "this is a header"; FS=":"}
{print $1, $2}
END {print "that was it"}
 

그리고 다음과 같이 실행하십시오.

awk -f print_fields.awk /etc/passwd   #-f advises awk which program file to load
 

또는 더 일반적으로 :

awk -f program-file input-file1 input-file2 ...
 

프로그램을 별도의 파일에 두는 이점은 정확한 식별자를 사용하여 programm을 작성하여 의미가 생기고 # 등의 주석을 포함 할 수 있다는 것입니다.