21. Linux awk 명령
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 에 주의해 야 합 니 다.
$ 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")}'
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.