awk는 라인 프로세서입니다. 화면 처리의 장점에 비해 대용량 파일을 처리할 때 메모리 오버플로나 처리 속도 저하 문제가 없습니다. 일반적으로 텍스트 정보 형식을 지정하는 데 사용됩니다
awk 처리 프로세스: 각 줄을 차례로 처리한 후
awk 명령 형식을 출력합니다.
awk [-F|-f|-v] 'BEGIN{} //{command1 command2} END{ } ' file
[-F|-f|-v] 큰 매개변수, -F는 구분 기호를 지정하고, -f는 스크립트를 호출하고, -v는 변수 var=value
' '을 정의합니다. ' 코드 블록 인용
BEGIN 코드 블록 초기화, 각 줄을 처리하기 전에 코드 초기화, 주로 전역 변수 참조, FS 구분 기호 설정
// 일치하는 코드 블록, 문자열 또는 일반일 수 있음 Expression
{} 하나 이상의 명령을 포함하는 명령 코드 블록
; 세미콜론으로 구분된 여러 명령
END 코드 블록 종료, 각 줄 다음에 실행되는 코드 블록 처리는 주로 최종 계산을 수행하거나 최종 요약 정보를 출력하는 데 사용됩니다.
특수 사항:
$0은 현재 줄 전체를 나타냅니다.
$1 첫 번째 필드
NF out of off off 's out out out out out out out out out out' ‐ NR ‐‐‐‐‐ 및 ? 증분적으로 각 파일은 1개의 구분 기호에서 시작됩니다. , 기본값은 줄 바꿈입니다(즉, 텍스트가 한 줄씩 입력됩니다)
~ 일치, ==
와 비교하여 정확한 비교가 아님!~ 일치하지 않음, 부정확한 비교
== 같음, 모두 같음, 정확한 비교
!= 같지 않음, 정확한 비교
&& 논리 및
|| 🎜 >+ 일치시 1개 이상을 뜻
/[0-9][0-9]+/ 2개 이상의 숫자
/[0-9][ 0-9 ]*/ 하나 이상의 숫자
FILENAME 파일 이름
OFS 출력 필드 구분 기호, 기본값도 공백이며 탭 등으로 변경할 수 있습니다.
ORS 출력 레코드 구분 기호는 기본적으로 개행 문자입니다. 즉, 처리 결과도 한 줄씩 화면에 출력됩니다.
-F'[:#/]' 세 개의 구분 기호 정의
print & $0
print는 지정된 내용을 인쇄하는 awk의 주요 명령입니다
awk '{print}' /etc/passwd == awk '{print $0} ' /etc/passwd
AWK '{Print ""}'/ETC/PASSWD // passwd의 내용을 출력하지 않고 동일한 수의 항공 라인을 출력합니다. AWK가 라인이라는 것을 추가로 설명합니다. 텍스트 처리 중awk '{print "a"}' /etc/passwd /etc/passwd /etc/passwd awk -F: '{print $1 print $2}' / etc/passwd /etc/passwd //텍스트를 한 줄씩 처리하는 방법을 더 자세히 이해하기 위해 각 줄의 처음 두 필드를 별도의 줄에 출력합니다awk -F: '{print $1,$3,$6}' OFS="t" /etc/passwd //탭 문자를 구분 기호로 사용하여 필드 1,3,6 출력 -f는 스크립트 파일을 지정합니다awk -f script.awk 파일BEGIN{FS=":"}{print $1} //효과는 a와 같습니다. 주 - F":" '{print $1}'(단, 구분 기호는 FS awk 'BEGIN{X =0} /^$/{ X+=를 사용하여 코드 자체에 지정됨) 1 } END{print "찾았습니다", l|awk 'BEGIN{sum=0}!/^d/{sum+=$5} END{print "전체 크기는",sum}'
-F는 구분 기호를 지정합니다
$1은 구분 기호를 지정한 후 첫 번째 필드를 의미하고, $3은 세 번째 필드를 의미하고, t는 탭 문자를 의미합니다.
하나 이상의 연속된 공백이나 탭은 구분 기호로 간주됩니다. 즉, 여러 개의 공백 하나의 공백으로 간주됩니다.
awk -F":" '{print $1}' /etc/passwd
awk -F":" '{print $1 $3}' / etc/passwd '에서 's''로 ‐ ‐ ‐ ‐ ‐
awk -F":" '{print $1 " " $3}' /etc /passwd $1과 $3을 구분하려면 공백을 수동으로 추가합니다.
awk -F":" '{ print "Username:" $1 "tt Uid:" $3 }' /etc/passwd //사용자 정의 출력
awk -F: '{print NF}' /etc/passwd //필드가 몇 줄인지 표시
AWK -F: 'NF == 4 {PRINT} '/ETC/PASSWD // 4개의 필드만 있는 행 표시
AWK -F:' NF & GT; 2 {Print $ 0} '/etc/passwd // 한 줄당 2개보다 큰 줄 수를 표시합니다.
AWK -F: '{Print nr, nf, $ nf, "T ",$0}' /etc/passwd //인쇄 줄 번호, 필드 번호, 마지막 필드 값, 탭 문자 및 순서대로 각 줄의 내용 awk -F: 'NR==5{print}' / etc/passwd | >
awk -F: 'NR==5 || NR==6{print}' /etc/passwd > Route -n | AWK 'NR! 첫 번째 줄
// 코드 블록 일치
// 순수 문자 일치 !//순수 문자 불일치 ~//필드 값 일치 !~//필드 값 불일치 ~/ a1|a2/Field 값은 a1 또는 a2와 일치합니다. awk '/mysql/' /etc /passwdawk '/mysql/{print }' /etc/passwdawk '/mysql/{print $0}' /etc/passwd /
awk '!/mysql/{print $0}' /etc/passwd ~ // mysql과 일치하지 않는 출력 라인
awk '/mysql|mail/{print}' /etc/passwd
awk '!/mysql|mail/{print}' /etc/passwd
awk -F: '/mail/ ,/mysql/{print}' /etc/passwd //간격 매칭
awk '/[2][7][7]*/{print $0}' /etc/passwd > awk -F: '$1~/mail/{print $1}' /etc/passwd > ) print $1}' /etc/passwd //위와 동일
awk -F: '$1!~/mail /{print $1}' /etc/passwd //일치하지 않음
awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd
IF 문
은 {}에서 사용해야 하며, ()
awk -F: '{if($1~/mail/) print $1로 비교 내용을 확장합니다. }' /etc/passwd ~ ~ ~ }}' /etc/passwd //if...else...
조건식
== != > >=
awk -F":" '$1=="mysql"{print $3}' /etc/passwd
awk -F":" '{if($1== "mysql") print $3}' /etc/passwd //위와 동일
awk -F":" '$1!="mysql"{print $3}' /etc/passwd //
awk -F":" '$3>1000{print $3 } ' /etc/passwd 사용 사용 ‐ ‐ ‐ ‐ ‐ ‐‐‐ //
awk -F":" '$3>=100{print $3}' " '$3
awk -F":" "'$3 🎜>논리 연산자
&& ||
awk -F: '$1~/mail/ && $3>8 {print }' /etc /passwd //논리 AND, $1은 메일과 일치합니다. 및 $3>8
awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd
awk -F: '$1 ~/mail/ || $3>1000 {print }' /etc/passwd //논리 OR
awk -F: '{if($1~/mail / || $3>1000) print } ' /etc/passwd
수치 연산
awk -F: '$3 > 100' /etc/passwd
awk -F: ' $3 > 100 || $3
awk -F: '$3+$4 > 200' /etc/passwd
awk -F: '/mysql |mail/{print $3+10}' /etc/passwd // 인쇄하려면 세 번째 필드에 10을 추가하세요.
awk -F: '/mysql/{print $3 -$4}' /etc/passwd / /뺄셈
awk -F: '/mysql/{print $3*$4}' /etc/passwd 🎜>awk '/MemFree /{PRINT $ 2/1024} '/Proc/Meminfo // A Division
AWK'/Memfree/{Print INT ($ 2/1024)} '/ProC/Meminfo // 전체 가져오기
출력 구분 기호 OFS
awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="t" netstat.txt
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="t" netstat.txt
//출력 필드 6은 WAIT 라인과 일치하며, 이는 각 라인의 라인 번호, 필드 4, 5, 6, 탭을 사용하여 필드를 구분합니다
명령 코드에서 처리 결과를 파일
①에 출력합니다. 블록 경로에서 직접 출력 -n |awk 'NR!=1{print > "./fs"}'
②출력 경로에 리디렉션 사용 -n|awk 'NR!=1{print} ' >
형식화된 출력netstat -anp|awk '{printf "%-8s %-8s %-10sn",$1,$2 ,$3}' printf는 형식 출력을 나타냅니다. % 형식화된 출력 구분 기호 -8 길이는 8자입니다. s는 문자열 유형을 나타냅니다. 각 줄의 처음 세 필드를 인쇄합니다. , 첫 번째 필드는 문자열 유형(길이 8)을 출력하도록 지정하고, 두 번째 필드는 문자열 유형(길이 8)을 출력하도록 지정합니다. 세 필드는 문자열 유형(길이 10)을 출력합니다.netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s n" ,$1,$2,$3}'netstat -anp |awk '$6=="LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s n", NR,$1,$2,$3}' IF 문awk -F: '{if($3>100) print "large"; else print " small"}' /etc/passwdsmall소형소형대형소형소형 awk -F: 'BEGIN{A=0; B=0} {if($3>100) {A++; "큰" 인쇄} else {B++; "작은" 인쇄}} END{print A, "T", B} ' /ETC /PASSWD// ID는 100보다 크고, A 더하기 1, 그렇지 않으면 B 더하기 1
AWK -F:' {if ($ 3 & lt; 100) Else Print} ' /ETC /PASSWD / / 스모크 100 이상 스킵, 그렇지 않은 경우
awk -F: 'BEGIN{i=1} {if(i awk -F: 'BEGIN{i=1} {if(i 另一种shape式 awk -F: '{print ($3>100 ? " yes":"no")}' /etc/passwd awk -F: '{print ($3>100 ? $3":tyes":$3":tno")}' /etc/passwd while语句 awk -F: 'BEGIN{i=1} {while(i 7 루트 1 7 x 2 7 0 3 7 0 4 7 루트 5 7 /root 6 数组 netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a ) print i,"t",a[i]}' netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%- 20s %-10s %-5s n", i,"t",a[i]}' 9523 1 9929 1 듣기 6 7903 1 3038/cupsd 1 7913 1 10837 1 9833 1 应용1 awk -F: '{print NF}' helloworld.sh //输出文件每行有多少字段 awk -F: '{$1,$2,$3,$4 인쇄 ,$5}' helloworld.sh //输出前5个字段 awk -F: '{print $1,$2,$3,$4,$5}' OFS='t' helloworld.sh //输출전 5个字段并使사용제시 awk -F: '{print NR,$1,$2,$3,$4,$5}' OFS='t' helloworld.sh //제시문符分隔输出前5个字段,并打印行号 应용2 awk -F'[:#]' '{print NF}' helloworld.sh // 더 많은 공유 정보: #, 输个每行多少字段 awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6,$7}' OFS='t ' helloworld.sh //제시형 符分隔输 多字段 应용3 awk -F'[:#/]' '{print NF}' helloworld .sh //결정 3个分隔符,并输流每行字段数 awk -F'[:#/]' '{print $1,$2,$3,$4 ,$5,$6,$7,$8 ,$9,$10,$11,$12}' helloworld.sh //system表符分隔输多字段 应용4 计算/home目录下,普文文件적대소, 使사용KB작화为单位 ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "총 크기:",sum/1024," KB"}' ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "총 크기:",int(sum/1024)," KB"}' //int是取整的意思 应用5 统计netstat -anp 状态为LISTEN 및 CONNECT的连接数分别是多少 netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i 합계) printf "%-10s %-6s %-3s n", i," " ,sum[i]}' 应용6 统计/home目录下不同用户的普文是多少? ls - l|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i 합계) printf "%-6s %-5s %-3s n",i," ",sum [i]}' mysql 199 root 374 统计/home目录下는 다른 용도로 사용하기 어려운 普文文件的大小总size是多少? ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i 합계) printf "%-6s %-5s %-3s %-2s n", i," ",sum[i]/1024/1024,"MB"}' 응용프로그램 7 출력점수표 awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno. Name No. Math 영어 Computer Totaln";printf "------------------------------- ------ -----n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %- 7초 %-7초 %-9초 %-10초 %-7초 n",NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf "------------ ------- ----------------------------------------N"; printf "%-24s % -7s %-9s %-20s n","합계:",math,eng,com;printf "%-24s %-7s %-9s %-20s n","Avg:", math/NR,eng/ NR,com/NR}' test0 결혼 2143 78 84 77 잭 2321 66 78 45 톰 2122 48 77 71 마이크 2537 87 97 95 밥 2415 40 57
[root@localhost home]# cat test0