>  기사  >  php教程  >  Linux awk 명령에 대한 자세한 설명

Linux awk 명령에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-12-12 16:14:301254검색

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: '{Print $ nf}' /etc /passwd // 각 줄의 한 줄당 nf 값을 인쇄합니다.

AWK -F: 'NF == 4 {PRINT} '/ETC/PASSWD // 4개의 필드만 있는 행 표시

AWK -F:' NF & GT; 2 {Print $ 0} '/etc/passwd // 한 줄당 2개보다 큰 줄 수를 표시합니다.

AWK '{Print nr, $ 0 }'/etc/passwd // 각 줄의 줄 번호를 출력

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 /passwd

awk '/mysql/{print }' /etc/passwd

awk '/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/passwd

small

소형

소형

대형

소형

소형

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


[root@localhost home]# cat test0

결혼 2143 78 84 77

잭 2321 66 78 45

톰 2122 48 77 71

마이크 2537 87 97 95

밥 2415 40 57

Linux awk 명령에 대한 자세한 설명

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.