EDA365电子论坛网

标题: Linux awk 命令 [打印本页]

作者: baqiao    时间: 2021-9-2 10:53
标题: Linux awk 命令

$ D! K7 W% P, L  O# CAWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
1 G0 T9 o- g$ j& k! ^+ K/ i7 f+ O& s! J. D8 a( ]2 D
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
0 d4 v( S( U  c7 ^4 `7 n, L9 E$ ]/ P2 A. `! R

. t$ _- o! v; \8 D( G
' t7 A/ E7 f. E& B2 }5 H  _) h语法
$ _2 n! H, `. I( w7 }3 f2 O: w6 u" z1 f7 @1 {6 P0 T
awk [选项参数] 'script' var=value file(s)
1 D  L6 \# R* v6 ]5 r
. U  x  S% v% f0 f
0 b  A3 O0 o/ w7 [' |7 j. }
2 z" _6 [& L4 {4 C2 k  @+ K* `8 @awk [选项参数] -f scriptfile var=value file(s)) V2 f, f1 M) ^" ?- y. H

) P! E: U9 k. X$ `* g4 ~
; p7 I# l1 z4 P/ h. m: O' \* C/ J3 Y6 \4 r
选项参数说明:  u" z5 t4 J0 u0 ~
9 h7 x6 f4 _5 l) u* T, w4 L
-F fs or --field-separator fs3 t" `) K0 {- Q# b+ K1 G, Z
( \7 A- K5 {" j6 X( K, w2 h4 z
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。: Z$ t5 l) w# Q/ \# U& N

$ `2 @8 X7 z: r% |2 R9 M-v var=value or --asign var=value
( u/ X) o7 z6 X* R0 l
/ L9 }( r5 D0 E2 r0 H$ v9 o" w3 F赋值一个用户定义变量。
9 l$ x6 N7 u$ `- e# v. f: b, F3 d" k0 [. R, U
-f scripfile or --file scriptfile0 M( e" l8 S7 n0 R# F: V

) r/ p, P6 P* ^4 g! v% o从脚本文件中读取awk命令。
4 S# p) F5 a, l6 D3 t% x  b7 z$ [. ]) e
: S) q- Q8 c2 ]8 M; o0 J) Z-mf nnn and -mr nnn$ d2 Y' H1 {( p4 c! e- {
+ l  ]( {7 ?9 V* }6 O+ p
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。; y( _- D9 O4 o. \4 j
8 j+ q3 ?, j9 i8 f% h7 Y- d
-W compact or --compat, -W traditional or --traditional3 ^# a& `  T( \* X+ ]. T9 q

' w$ T( o1 ^* C. W8 r0 @在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
5 @6 y9 Z# P7 p  w
/ j& y! i; R% N2 o* i-W copyleft or --copyleft, -W copyright or --copyright% r( W4 Z, y9 j0 Q4 ^2 q

/ p9 H: Q6 a- G打印简短的版权信息。! T( L* R  k0 `7 D3 h5 q' g
8 R4 V! H3 c, Q
-W help or --help, -W usage or --usage
; ?7 o! |; z( A' B* `0 x
8 [3 E. A; ^. ^" U2 g; h9 k打印全部awk选项和每个选项的简短说明。
# e( R2 b! X1 h' G" i) z- g6 v# p( P7 Z6 @+ n
-W lint or --lint
: C& j4 }3 Q- c1 P2 O& N4 K" a/ U+ D! f0 N- P; I3 M1 U  t
打印不能向传统unix平台移植的结构的警告。
& f3 f  W( B' n8 Q2 A0 S3 @  o
" o/ C8 \, ?8 q' ?- ]: h; C, m-W lint-old or --lint-old9 ~  l  j& P  m$ \/ Q5 v7 c
* x% n4 F, v' R/ n' {' h& E  e# i
打印关于不能向传统unix平台移植的结构的警告。
: \, y3 l3 K& P6 n" E3 x# }. ^1 \! q1 t  r* X0 E
-W posix! s, h8 ?2 s% U, _" y

# R1 F" c- T) M( j打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
: o! I( X+ {) _# g
5 x% C& L& u: K-W re-interval or --re-inerval
9 ?- p2 u; k0 I2 S
7 k8 t# F$ ^8 P3 B: `& U. {允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
- u$ ^2 V2 i+ @$ s. y# _, [$ u4 _: r* v& |1 N  e# @
-W source program-text or --source program-text; U% ^- H1 Z" r: c+ S2 s
3 Q9 r+ P( F4 Q& B4 c
使用program-text作为源代码,可与-f命令混用。4 f- S6 y/ _  \. M; B- }% w

# W0 z; a' L' H& z-W version or --version# a, N, m. P; A3 l5 e& X" E
9 s1 a$ o* M+ |9 y5 I: g
打印bug报告信息的版本。
" C; v7 L" D9 ^5 m2 H) y
2 k# m3 e7 D( w' ~, R. |) Y7 g* j* B- }
, l9 a- f& A4 h8 U, X: N! P
/ F* m* p/ l4 e基本用法3 I" d) X: B" x# W4 j' ]

2 n( b& f3 K# h5 H- @$ n, U5 Mlog.txt文本内容如下:* y! m' A' C1 O8 {1 Z
/ }# \8 N( H& L3 z) V1 B3 v( a( r
2 this is a test
' E# K! Q  O, F' _% t- C$ U3 Are you like awk% z1 K" R. t% j( @9 y
This's a test
) B- U  c% A  w: o/ J! |% [10 There are orange,apple,mongo
# e. C6 o% v! S& {( R) x, p! x
8 C1 C3 n7 J0 |& }
) j. G" `. d7 T: P' `: C用法一:, n/ p! t) ?  i* @
6 C! ?) i9 x" ^9 W
awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号+ \* D3 L8 P6 ^$ P1 g  g
* e; b, U, G: V7 o

8 b' z* d( e) `1 r. Y$ A4 l实例:
! n* f& c, t! _5 D; i' ?6 t
% X1 z; v; g# g* @# 每行按空格或TAB分割,输出文本中的1、4项
2 ?; Y4 ^: s# X1 N/ _2 ` $ awk '{print $1,$4}' log.txt
/ H* o" d. v, d# d1 S. w6 g, D ---------------------------------------------7 x! L6 L5 c) W/ o( ?& s- |
2 a
5 L9 m3 e" }5 e3 e 3 like
) l0 N5 l' ?7 h0 N3 H2 ?' t This's
0 r3 W) E0 I( m' W  r 10 orange,apple,mongo
( k8 R1 F4 x0 ]' r8 O: N* A # 格式化输出: J) ^3 B; H4 w9 M6 u) H+ q
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
% p& |; Q+ J  C( r: W7 @8 } ---------------------------------------------, o& A4 r( {, y; h) @
2        a
( k+ p8 A( U. g/ {7 i% R! G+ z+ W3 \ 3        like! ^/ i/ ?: W9 g
This's$ Q8 P, i3 m* N9 K
10       orange,apple,mongo
9 z7 o& ^/ y) l3 V5 a2 [4 J5 H4 V
% v7 a. B+ T$ `1 N/ I) a+ _  H) ~8 Y4 }8 a1 P# j
用法二:' d# m. A. Q% i0 [( o

' O. b! ^  E& Y$ Eawk -F  #-F相当于内置变量FS, 指定分割字符/ w7 S4 ], T% J: X, ]+ I
6 U( ?' r6 L$ n2 X4 ]

5 B+ y, d3 j/ b0 ~实例:
. _' G6 h: D3 [% I2 W8 Z
. T$ `. M' X1 j$ n$ p# 使用","分割
) R* I, Z( U# L1 }2 }  u+ Z $  awk -F, '{print $1,$2}'   log.txt4 B$ p& ]. M# b5 H2 c
---------------------------------------------9 i  ?5 E; H" ~
2 this is a test
* k7 Q0 [1 h- v6 c" X$ Y 3 Are you like awk4 f& e+ V7 p  k! s9 j2 q8 A
This's a test% E5 e0 l) |* y0 {- }" R
10 There are orange apple+ K4 \% P. Q% N
# 或者使用内建变量, s/ R: o# B: Z4 [
$ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt9 U1 A) X, L$ \  J9 C
---------------------------------------------
$ |9 ?* o) k! U7 W0 s4 ]0 i- c! P7 I 2 this is a test
" m$ @0 o" r" h$ z& Y 3 Are you like awk6 R/ F; S6 j3 _- {+ ?
This's a test
1 y* M9 Q$ F3 K- ~ 10 There are orange apple
& N* g8 h: u# R* Z- Z: @ # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割, B* h% Y, Q) ~2 W7 y8 L4 X
$ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
" n4 i6 u0 y, G  p) m  t) ^ ---------------------------------------------+ g: o2 N( \5 B* {: Q9 j
2 this test/ {. r" B0 p" V: a, i
3 Are awk
2 a# r3 y1 a1 K" s This's a2 F" V2 O. a" n4 I  L
10 There apple9 Y8 s& q6 l* v$ v- P% I$ u

  g6 V* T5 s3 j& b
& d# L1 e2 x& f* e/ S6 I4 G) K. p9 ]& [+ U( ^! `  A
用法三:
' C' f+ z/ Z# ]4 @
; c7 e: R' R" N( W9 K5 \awk -v  # 设置变量
% G9 a4 A# V- q8 l) |. Q: G) _" {8 F) s1 z$ e. e8 c

9 Y7 O( K0 C8 D1 H7 q6 E* f9 d* k实例:
* m; U$ Y: Z0 Y; n9 r% }' o8 ~! {3 _, R2 O8 @' J: C+ ^
$ awk -va=1 '{print $1,$1+a}' log.txt$ }8 U+ q+ m& e7 k
---------------------------------------------" u  w$ `3 S! N
2 3
# {5 q  e( K$ U+ O5 d 3 4, y6 Z: E4 l( u7 w7 \
This's 1
4 t) P# F: z! m. G4 I, Q 10 11
9 d7 Y- W- \$ }% ? $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
& U" D* Y' S5 i$ c ---------------------------------------------4 Q  w$ Q/ w9 @8 M9 a
2 3 2s4 B, K# }! A: D" A: ?3 n/ k0 k: ~* o
3 4 3s
6 D' e- E; w7 n# A This's 1 This'ss$ k5 K* x1 M! }' J$ N: @$ S# n0 [
10 11 10s
3 _' e# F' m" Q6 u# Z- e$ W9 e# s3 r$ q0 U. J

! _7 y) G5 R  @; l* X" B) v用法四:
; m0 B1 [) l' v4 `- {) T! W% F0 W5 M8 ~: c( N
awk -f {awk脚本} {文件名}2 P8 k# Y: o( |  W2 X. i- o
9 Z1 }# r6 T9 N$ }7 c% c

" D1 k  c3 D7 F( V. K8 \- I' @实例:4 W; ~1 z* O2 C) d; |" p8 Y% u

" X6 W7 @' x* r3 n! ` $ awk -f cal.awk log.txt
' ]7 w. \& t7 W3 [1 o运算符
( ^, ]' @9 D0 w0 a" f! Q2 [, Z运算符        描述& b; R( r; B! m- O7 [
= += -= *= /= %= ^= **=        赋值4 o& u8 n1 |4 y! X
?:        C条件表达式
. m# w3 B* W, }4 V||        逻辑或
, d! N( x6 z$ `# _: ]&&        逻辑与
3 H; f  v+ r1 @- y4 x) d! H( d, ^~ 和 !~        匹配正则表达式和不匹配正则表达式
# t( B- K) E( u/ {5 v3 S< <= > >= != ==        关系运算符
6 @; c* A: C6 j5 r! ]& r空格        连接+ p% p5 K2 n) Z& j, B6 G
+ -        加,减
/ i! R; v' Q) @6 y" h9 _2 L* / %        乘,除与求余
# |; d4 m: N* H' q6 |% e: `, P+ - !        一元加,减和逻辑非
" ^; ^' M" s- D7 E1 ?" k% v; n) G^ ***        求幂8 e: y* Y: C) y5 |: f8 o
++ --        增加或减少,作为前缀或后缀
, g( W( O( E2 d7 f2 p3 m$ }# K! o) U$        字段引用& u5 U% r; H+ P
in        数组成员0 V/ r# w4 w  }: a/ d; t+ |. X
过滤第一列大于2的行3 M2 N/ d9 I/ X: e
7 j, }/ K* o) v8 z/ ]0 b8 c# x
$ awk '$1>2' log.txt    #命令
' T, W/ \. Y7 v- t) C9 {#输出9 U9 v1 W' N  t  |& n
3 Are you like awk0 w' J  O& i1 f7 e9 n3 s) E3 t
This's a test" \  P9 {- E8 a8 H* g5 R' |# s
10 There are orange,apple,mongo4 C% g( t& s6 S4 c' i
过滤第一列等于2的行, f* x% z5 k" r+ e! i$ b- ]

# }6 D) G. o/ E$ awk '$1==2 {print $1,$3}' log.txt    #命令: k: N7 a* \& ^7 ^- W2 ~
#输出
3 X/ x6 I, |& w% q2 is& V9 k, C! B( \
过滤第一列大于2并且第二列等于'Are'的行
4 m2 g. X2 @& R6 p2 N6 L7 |1 C1 j  a! `5 Q- t( p6 `* G# C/ H
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
0 D9 y% {7 B- K, e( E$ y#输出' |" U4 d! e$ T) ^0 U  [
3 Are you- ~+ V% V; |" G; D
内建变量; `* t' m) Z6 Z) P+ V' O# m6 j4 z# X
变量        描述
$ N8 ]6 K* y' T" B( Y0 z  Z$n        当前记录的第n个字段,字段间由FS分隔
+ F5 H1 R8 g7 I: X" E8 r/ m$ {* p$0        完整的输入记录( L0 x1 |! @- j" f# W8 N3 v0 H
ARGC        命令行参数的数目
8 G8 ?- L1 D9 s! E+ h% P) PARGIND        命令行中当前文件的位置(从0开始算)
8 ~2 V$ m2 v$ R$ ^& K7 A) F8 IARGV        包含命令行参数的数组
2 X! Q" d/ N. f, _/ S5 ^+ A6 }CONVFMT        数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组  x& K( k* _* Y
ERRNO        最后一个系统错误的描述5 u" W; r) b, K0 L4 N4 c  {  I
FIELDWIDTHS        字段宽度列表(用空格键分隔)6 b! c+ p0 [, d7 o$ N+ z8 v5 u) @
FILENAME        当前文件名8 h9 c, l7 d7 b6 u+ X% ^* F+ ?
FNR        各文件分别计数的行号' r" l/ C( C$ d
FS        字段分隔符(默认是任何空格)
( Y  ~. P- Q4 j' oIGNORECASE        如果为真,则进行忽略大小写的匹配
( I' g- j3 N# i( [5 {5 X4 p. fNF        一条记录的字段的数目5 `. I% o) _$ b  n8 u$ {- V  E$ Z' P
NR        已经读出的记录数,就是行号,从1开始* Y3 V- k1 f6 ^
OFMT        数字的输出格式(默认值是%.6g)0 X8 C* q7 I  ]% ?. \- `' O5 X
OFS        输出字段分隔符,默认值与输入字段分隔符一致。& A* l3 D# \" ^* _2 F* E2 z( I
ORS        输出记录分隔符(默认值是一个换行符)
0 U( p, G4 O1 a8 H3 t) q% YRLENGTH        由match函数所匹配的字符串的长度
* Y* {% x" _8 R+ x# e2 _6 nRS        记录分隔符(默认是一个换行符)
" f. m/ Y+ u* r5 A% W! sRSTART        由match函数所匹配的字符串的第一个位置. t# ?& C6 L# }$ a0 M( h
SUBSEP        数组下标分隔符(默认值是/034)
5 q0 |3 P8 _! _& i/ M9 M7 [$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt5 L2 M; E; z+ Z) Q* H; I; g5 N
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
4 K# _: ~" x5 R6 W( H$ l  \---------------------------------------------
8 v; y  }' X; ]1 c* ^+ a, glog.txt    2    1         5    1
2 V7 D3 w' I7 K" D( U) r# w) l/ tlog.txt    2    2         5    2$ u" l4 ?/ W' U( I% |
log.txt    2    3         3    36 |& ]" @2 B2 D# J, H; Z6 M
log.txt    2    4         4    4
) `  q& A8 P, Q7 ~$ awk -F\' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
2 d3 Y* X. }. DFILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS$ f; z: q8 U3 e0 A+ j9 s4 J2 }
---------------------------------------------- W! I( W: F  {* t7 N9 P, U9 m/ ^
log.txt    2    1    '    1    1
4 J3 {( s, a* X7 s/ _( H) I, b7 B( w8 qlog.txt    2    2    '    1    2% ]8 v+ W$ T8 c/ v
log.txt    2    3    '    2    3! U7 b9 \0 ^; g4 a$ a! A" m5 S) f
log.txt    2    4    '    1    4) H% U. o0 H: r8 d
# 输出顺序号 NR, 匹配文本行号
% Z- X+ ^% V4 i$ m) }' q8 B/ E$ awk '{print NR,FNR,$1,$2,$3}' log.txt! E8 e) c( V& @2 o* K
---------------------------------------------, k& i2 Z6 B6 @/ W- }* \" E8 X
1 1 2 this is
/ l; j" ^6 n- _1 `6 k5 G. F2 2 3 Are you
7 _- w" A$ C' ^+ L, a3 j/ Y& [3 3 This's a test; Q. P$ B& ?# a- `
4 4 10 There are
, M! N6 b+ o' P+ g# 指定输出分割符
" ^; ^# W9 v9 {% Z; d7 x( X$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
; b' j8 @. P6 ~, h% k  L---------------------------------------------
% w% v/ ?- a, H. K9 d, U2 $ this $ test
1 J$ _7 x5 X1 w: k' h3 $ Are $ awk
+ p9 q1 d/ g; l- EThis's $ a $
- l3 j/ w' x3 ]' `10 $ There $
$ Q/ `$ j( x* i使用正则,字符串匹配, f; D8 c% }7 R& m
# 输出第二列包含 "th",并打印第二列与第四列
. _- g( L/ M+ W8 n3 n/ k) k: g0 k$ awk '$2 ~ /th/ {print $2,$4}' log.txt
( u, p7 @/ Z2 r2 A% U$ K3 V! }& d---------------------------------------------
2 \; N. O8 _  Jthis a
- g7 F4 r9 u8 G; R; n* T~ 表示模式开始。// 中是模式。
; b- V4 Y/ z  g  ~. {3 p$ A: h8 ?  H2 f
# 输出包含 "re" 的行
: K1 s9 L7 ^& Y5 u$ awk '/re/ ' log.txt% N" l' f/ Y) r7 _! w9 _
---------------------------------------------
2 |4 Y# I5 n: }- B# J7 B3 Are you like awk
! B3 d: ^* x% A1 E; I; e10 There are orange,apple,mongo# v8 v) U. E$ B0 b
忽略大小写
3 X' ?  f* d. U" b$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt) G9 x) d1 {; r: l5 r
---------------------------------------------) ^9 T5 c# z' w
2 this is a test
* `8 @9 Y+ V# }- R) lThis's a test
2 x" p& _4 d8 b: R' u模式取反
/ L- }6 K7 H5 M; {6 ]" u$ awk '$2 !~ /th/ {print $2,$4}' log.txt1 `$ y, i7 N) n; X" U( {  ]
---------------------------------------------
- |. k" s4 I9 u# ]; yAre like& a+ O$ y$ v" i! w1 n/ |
a
( @6 a) x# I) g! ~There orange,apple,mongo
& ], i* W1 m: N) C  k! j$ awk '!/th/ {print $2,$4}' log.txt
  [* P' h; V) ^" E; O# ^---------------------------------------------' }5 q" V% E$ {, D' U( c
Are like
" r3 @7 `1 ]! O& ^- q: z0 P9 fa
4 L8 v" `% R- ZThere orange,apple,mongo
. {" F5 P  D% Qawk脚本& `. O4 z9 a& W- V7 k8 R' e
关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。3 m6 m: P% n& e$ b( A4 |

( ]# h8 l. S4 |! G3 L+ ?7 p3 WBEGIN{ 这里面放的是执行前的语句 }; U- ^( B, o9 Z. y
END {这里面放的是处理完所有的行后要执行的语句 }
+ U, [) b" Q8 K{这里面放的是处理每一行时要执行的语句}
( P5 ]/ h9 w# `$ j4 V+ c9 K假设有这么一个文件(学生成绩表):4 b* q6 e, z) y1 I! `
% d! z' q1 U2 Z; L: l
$ cat score.txt
) ~. l4 s5 t; y8 I$ Q, eMarry   2143 78 84 77
4 K2 I5 i' h4 M$ d( n1 v; a4 sJack    2321 66 78 45
! G3 _! e: R) j7 N  u9 b( b  _Tom     2122 48 77 71
; Q' w( A5 o6 B8 F$ j5 IMike    2537 87 97 95
9 K1 Y& s  ^, V$ L% oBob     2415 40 57 62
) J3 h( D6 q6 ?2 G8 I; t$ ?我们的 awk 脚本如下:4 |# Z, Z2 N4 q- |+ t; l
9 c% i" d9 T) ^) L- G8 e6 v% U
$ cat cal.awk' F; y8 ^+ j8 X& G3 {( q$ G
#!/bin/awk -f/ o: M( |( \* J, w& K  y
#运行前% r1 o1 A8 D; }2 w5 C: U
BEGIN {' I) Z% u- v# R. l( z
    math = 02 b7 p6 H: Z) O
    english = 08 D' g4 ?  v+ j1 _1 T
    computer = 05 r" a  l! p) @4 I+ R

4 |% z: O( Q% z  y, R% ^    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
2 w! u' K2 V/ D: p* Q    printf "---------------------------------------------\n"! y0 l7 a5 _! b" }( u, g- M" ~
}( D0 o$ |; d  k0 A" H: ?
#运行中
& m  h, @3 _7 h* r: G) n{# f) l( I! ^2 _$ j* w
    math+=$3
8 ^. b3 y. G" ^7 v9 i    english+=$4+ X  O$ j% T2 n# R# @/ h6 e
    computer+=$58 g2 d5 o! j, B
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5: B- f& r6 u0 @
}
3 j0 W1 Z5 g/ f, f* M#运行后" B' r, c0 m2 \
END {1 f4 ?/ Y1 ~4 A; b: J5 }( J
    printf "---------------------------------------------\n") m, |3 B, d- n" j
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
2 |* x3 S; o, F% i& B3 `9 c    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR. |' l5 d4 O6 \, g7 o5 e( C
}, z4 h# c0 p% L/ c8 [
我们来看一下执行结果:
6 q4 H6 {; Z" |( x3 j$ y) p& k2 s7 |# K
  b$ K* s6 w3 \- A/ t  s0 _$ awk -f cal.awk score.txt
9 P8 ]' B! z- _3 G# ^9 Y) D' {NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL7 C( f! n3 _5 `
---------------------------------------------
5 i" _; b! R3 ^6 i" H2 QMarry  2143     78       84       77      2395 ~; T  R7 P6 U# a
Jack   2321     66       78       45      189* I+ n) G+ C, L1 k+ T
Tom    2122     48       77       71      196$ p/ W" ?; e6 w- ?
Mike   2537     87       97       95      279! n" t' _9 O9 b
Bob    2415     40       57       62      159) p  G* u8 s  n* o2 |% Q
---------------------------------------------
: w6 y# c5 I( p- v  TOTAL:       319      393      350
9 f3 @! O* ]  y/ ]+ }AVERAGE:     63.80    78.60    70.00
" I9 r( `8 J& P* R3 a- ^! C. Y& z另外一些实例
+ ~1 j# L0 Y8 j& D" l7 {* T0 YAWK 的 hello world 程序为:
+ f9 s) a- a2 S4 h- G1 C) b8 f5 k- p2 ~
BEGIN { print "Hello, world!" }
8 ~* n; I5 O' p* V4 ]+ S" c计算文件大小6 r5 m& e  J7 C
1 o6 K6 Y  ^  p& q" b
$ ls -l *.txt | awk '{sum+=$5} END {print sum}'
3 u# A, T. r. g5 d% P9 R9 z; q- R$ u--------------------------------------------------
/ a. j6 \- O+ K2 J666581
0 e- {* L6 U! ~, {2 ?从文件中找出长度大于 80 的行:6 v* Z1 {* l# C2 S

5 f: A' d, [4 ~/ ]awk 'length>80' log.txt$ M5 d9 t3 M* v# l5 X
打印九九乘法表' |# I+ M0 U, R; L4 Q; r
  U2 C; M8 M* R
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?"\n":"\t")}', W: R+ A% K/ [8 V

作者: qpggup    时间: 2021-9-2 13:45
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
作者: youOK    时间: 2021-9-2 13:47
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符
作者: xiaogegepcb    时间: 2021-9-2 13:48
AWK是一个强大的文本分析工具




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2