awk 튜토리얼
awk 시작하기
수색…
비고
버전
| 이름 | 초기 버전 | 번역 | 출시일 |
|---|---|---|---|
| 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 |
안녕 세상
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을 작성하여 의미가 생기고 # 등의 주석을 포함 할 수 있다는 것입니다.
예제에 의한 AWK
AWK는 주로 UNIX 시스템에서 사용되는 문자열 조작 언어입니다. AWK의 기본 개념은 너무 복잡하지 않은 파일 작업을 할 때 사용할 다양한 언어를 만드는 것이 었습니다.
AWK에는 몇 가지 다른 변형이 있지만 기본 개념은 추가 기능과 동일합니다. 이러한 다른 변형은 NAWK 및 GAWK입니다. GAWK에는 두 가지 기능이 모두 포함되어 있으며, NAWK는 AWK보다 한 단계 위입니다.
AWK를 생각하는 가장 간단한 방법은 두 가지 주요 부분이 있다고 생각하는 것입니다. 패턴과 행동.
아마도 AWK의 가장 기본적인 예제가 될 것입니다 : (Hello World 참조)
BEGIN {print "START"}
{print }
END {print "STOP" }
여기서 키워드는 BEGIN 및 END 이며 패턴은 {} 안에 있습니다. 이 예제는 쓸모가 없지만 실제로 유용한 함수로 만들려면 사소한 변경 만 수행하면됩니다.
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와 유사한 구조가있는 쉘 명령과 유사한 일련의 명령문 입니다.
``는 다음 규칙에 따라 처리됩니다.
-
BEGIN ...및END ...는 선택 사항이며 awk 입력 행 처리 전후에 실행됩니다. - awk 입력의 각 행에 대해
<condN>조건이 고기 인 경우 관련<program actions>블록이 실행됩니다. -
{<program actions>}기본값은{print $0}입니다.
조건 은 표준 논리 연산자와 결합 할 수 있습니다.
/gold/ || /USA/ && !/1986/
여기서 && 는 || 보다 우선합니다. ;
print 문 . print item1 item2 문을 인쇄하면 STDOUT에 항목이 인쇄됩니다.
항목은 변수 ( X , $0 ), 문자열 ( "hello") 또는 숫자가 될 수 있습니다.
item1, item2 는 OFS 변수의 값과 대조됩니다.
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 발생하는 위치를 반환하고 RSTART 와 RLENGTH 의 값을 설정합니다. 인수 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
stat1 및 stat2 가 명령문 인 경우, 다음도 명령문입니다.
{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