找回密码
 注册
关于网站域名变更的通知
查看: 501|回复: 3
打印 上一主题 下一主题

Linux awk 命令

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-2 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

9 e5 G' F% Z* a+ |& S/ _) M! L+ ~AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。9 D  U- A( f( P/ ~5 R5 {
8 B! E- s4 G2 S# a7 E( L
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
4 T% Q/ f* q9 ]5 R9 H0 }" ?: n1 }9 d8 v8 f( K' l5 s
$ @5 D, J  f% c$ \+ N. ^

$ D+ f; o9 w' ^  O3 U$ G! O语法2 c6 w; Q2 \9 d7 b+ P( n

% Q7 p- D9 X9 c( e0 Z/ nawk [选项参数] 'script' var=value file(s)
1 U4 i! }# `# b/ s4 E1 w
+ X; Z& B9 q0 v) a. i2 B  C3 O

. d+ G7 x) N3 D- q0 t, }- [+ R* Xawk [选项参数] -f scriptfile var=value file(s)5 \1 _/ |* k6 _5 y2 g2 f

2 b" E% {/ u  {# ]8 F; E  R) E; R# J6 S: Q9 V$ L

* k* q; ]( \; N) d# o. B选项参数说明:' L; t3 q: w) V* d" Z' V2 H5 }' ~+ _
3 J5 ~. ^+ R" F) h5 P( s
-F fs or --field-separator fs
( w$ E& [( k& k9 F& m$ s9 i( u, F! w; r9 u7 ~1 W
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
5 {5 w8 p, N* i6 u7 |0 O' |2 X% V% `3 Q1 a% \
-v var=value or --asign var=value
; s( w  S0 m1 Y2 l2 n) ]* r, K( s7 @; ]5 v  Q; L* L5 _0 E/ |
赋值一个用户定义变量。% s! Z$ I* |" ~
1 \6 R- s1 Y/ l
-f scripfile or --file scriptfile
- y( }9 q$ A' @) y$ K0 C. O( `" |9 y( s. [& P6 {( ]
从脚本文件中读取awk命令。4 V& j* r% Z; `& Z$ L' `

7 g9 [+ b3 K& n3 a1 U-mf nnn and -mr nnn% G2 R8 [3 n7 N" A6 K

  M$ D5 Z) z1 d( Z2 A9 A对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。' r, V: v6 {" v! G1 N* Q1 X
' K5 i4 d& l/ `) v5 q% E% Y
-W compact or --compat, -W traditional or --traditional6 Z  D6 f& @2 L

; L* J. Q+ x! g在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
5 w- J4 r3 \( o2 N) O7 Z2 `$ Z" c' W( Y$ e* O
-W copyleft or --copyleft, -W copyright or --copyright& S3 L$ y# o* w1 J

  i+ ]% G, p4 m& q& n8 k; X: x* L1 n打印简短的版权信息。% U0 [9 V1 ~2 i

  l8 D. D1 P! i- G+ }! S  X+ I-W help or --help, -W usage or --usage
% J( J$ K0 K% J
; M( w1 k$ J- j7 c# M) B打印全部awk选项和每个选项的简短说明。* n0 a- Y9 [8 \+ m6 a+ m7 ^* L* k4 F
8 s8 @& M3 \' J2 N4 A4 Q
-W lint or --lint* s7 v) s% x8 h% r! O

5 `+ e$ Q: L2 M0 y4 F1 ]0 q打印不能向传统unix平台移植的结构的警告。- U' ~0 j4 d: I$ [: S' w
7 H/ n9 `1 C8 ^
-W lint-old or --lint-old
8 H. B& t8 c2 C/ A) v3 I
# V* B' n  ^9 t4 l$ ~$ d7 C. `$ ^打印关于不能向传统unix平台移植的结构的警告。) C+ v" o- q: I. _! p/ @, G
& c: f, T1 P8 q" g( a9 k7 R0 X
-W posix
% b% D& z3 K+ \* @& M; U# c
) O' |7 b! `2 _: y1 j$ [: C打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
, }" Q& |: B5 x' t
! H3 h+ v, U0 K/ D-W re-interval or --re-inerval
" O! b3 [: \* @) q. A* a
; I1 A$ ~4 \/ e; H. x5 B) |允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。' [, H8 Y# ^* K' ]; Q
* `4 v% F4 S! B  g2 I3 c
-W source program-text or --source program-text: |- N% _: c* T

6 \$ G0 u! v  |0 g3 T- ]使用program-text作为源代码,可与-f命令混用。
' s! E# v1 d: p
6 ~' }! J$ ]% V-W version or --version' d% w5 u8 Z+ Y' |
/ r/ I3 J/ w4 U+ g; ~, o! a
打印bug报告信息的版本。! H; S5 D3 [7 c

$ m' [4 Q6 a1 Q- y
. u/ D! Z1 C8 i% Q7 r, M
# k, E7 \7 ?9 \2 L基本用法
# y6 l4 M! F3 v8 u# U& x1 m. N0 ~3 g) K( N1 s
log.txt文本内容如下:
; _9 x. D. I; w' X% I/ z, e" u, p# _8 g1 I
2 this is a test! A; g0 {* Q8 S+ W, q* Q
3 Are you like awk$ w" ], R2 \% N5 w8 u
This's a test# j$ ~# r& f; v: |
10 There are orange,apple,mongo8 K3 P5 W0 r( M% W9 @7 k; a2 D
0 i" W) O4 J: F6 E1 l0 d& U1 u) ~

! P3 D  \. q3 b6 U/ r* Z( ]. S2 g5 X用法一:" u8 g: ~: y- G
; x2 R! I1 k3 ^
awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号
7 Z5 K' I1 F. R( E2 M6 J) L2 P4 l
( Q6 \, W7 P& E; ]6 N
) a0 k  c% D9 r0 v* e实例:/ i# I+ v: H. D. ?5 F) z1 Z

! B0 s1 b) S) w/ L# 每行按空格或TAB分割,输出文本中的1、4项8 \0 c* Q* b& C1 t* }+ U: ^# s1 X
$ awk '{print $1,$4}' log.txt# q( P, `% M5 m" B. Z
---------------------------------------------
6 r, ?2 U8 Z  `) `  U+ f4 e 2 a
5 Z$ a. ~8 g8 V* B' X 3 like2 _9 g" _1 ]0 O( |, l7 w
This's& o2 @% G6 `- g2 p
10 orange,apple,mongo$ V7 _2 g! r9 f# J
# 格式化输出3 Z+ L) d7 \5 ]0 Z7 D+ ~" [
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt4 H/ C% N9 x( O- Q2 p" M
---------------------------------------------2 _) v# r4 H- z' X
2        a
) w# I( g+ }. r8 j. C  \$ o5 c 3        like: J( @& D4 T, V6 K6 l
This's
" ]" F& b! l% j3 I6 ` 10       orange,apple,mongo; j$ Z# `3 N8 t+ n" c$ T
1 Q' \$ k" l+ _

" f- ^1 U7 {/ A& p0 _. U1 H+ B  D用法二:
7 f/ K; m0 W) y; v0 |, ^  z+ L# \2 G0 ^4 Y, Q6 m# K% e) ]) Z0 v# \1 t' l
awk -F  #-F相当于内置变量FS, 指定分割字符
  Q; C8 I( N9 J8 V1 p
4 d! Y1 m# A$ B) s+ Z( Q: i8 J# Q1 D8 z7 f) m0 U. d
实例:2 F  m: ~3 r! ~
6 G3 J6 l1 U7 _( M& W" u  ?0 z
# 使用","分割5 q1 J8 J9 W& |& H% |) n
$  awk -F, '{print $1,$2}'   log.txt& k: G4 T1 U- t
---------------------------------------------
4 S. ^& ]& B$ s$ `' p% b0 v  k 2 this is a test! _4 C/ ?7 u9 k, J! j- z6 z' w4 i
3 Are you like awk
. S  u& k5 Q' A. k- E# H# y- P This's a test
3 ?8 ?/ n- |7 e9 p: [5 J 10 There are orange apple' Y& [7 X2 |; v1 W9 [+ _7 `# c
# 或者使用内建变量9 X6 n" G% j9 z4 Z! A
$ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
, T9 S! \+ v3 z( r& T ---------------------------------------------
0 y% c2 ^6 H) @& Q4 | 2 this is a test
/ v' e; Z3 J5 Y+ {: A2 {; n; I8 O 3 Are you like awk; B! x- P& S1 z5 ], @) I5 l+ h
This's a test9 y- |, G: m3 N* Y
10 There are orange apple
" L4 }. c! N( K) s/ }$ @2 Z! m3 R # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
9 {, p% y$ |' ?8 H4 o $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt4 z' i! u7 h8 i0 P4 i
---------------------------------------------& h: M( Y  Q2 E) P$ }4 P+ i
2 this test3 M# P% L# f& R& W( p5 ~. u
3 Are awk0 m2 _# T" P, v6 j$ P4 I5 \
This's a0 C( {/ ?: I& l/ e
10 There apple  B) p, y1 |, i, @$ J
& M8 U5 q$ C9 j4 J+ v
/ Q$ t! B9 ]" _- }  ~3 D

: y+ F. b5 L' D+ J" u用法三:
, L" z6 f2 g. y, t6 s4 J! i# b* M+ _1 W8 L
awk -v  # 设置变量. Q) S) J' I/ v, ?* }

$ O  s, A" {% Y0 {2 [. _3 ~& ~0 F/ ^8 v, f  c2 v$ L3 N. g1 K- z
实例:8 P$ R9 _/ {1 ~) s) d

/ r! Q9 `( O* r7 o$ e $ awk -va=1 '{print $1,$1+a}' log.txt' C: k% `% c. I1 q" {) K
---------------------------------------------; e( B1 U; I' l( K+ p
2 38 {+ Y) ~# Q  I: U" h3 q( g% [: B
3 4
6 V* m+ g) o$ i- G2 \. _ This's 1. r. a, S% Z2 M- r/ A) h
10 11
; ]: u% F6 o) ] $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
0 f5 g$ X* c; {7 s; a ---------------------------------------------5 H  E, j& `8 K8 s) |) C8 b, k
2 3 2s
' `& R7 p* ]. ]" D" V 3 4 3s
( C3 [% C1 j6 T2 S This's 1 This'ss, G. r) a5 H' y0 A$ F; k
10 11 10s# E, {0 {; y3 X7 r. C- r
& l: o, ^# w1 N* R3 F& s. x
( ?/ p& x# ^6 p
用法四:& I3 r9 {) A+ g, Z/ o, e- z) d

+ _6 w# b' v+ D5 v! W) D) ]7 aawk -f {awk脚本} {文件名}! k: e( ?# {3 `) {- }  Y) {

: g! `0 e1 W( N2 F6 [' g. i# \% ~, ^9 _) d3 u3 p8 x; A
实例:% G; t/ {, V$ {: n
$ S) }; V& W% ^
$ awk -f cal.awk log.txt
6 A6 b# Z- V2 y) S9 v6 e运算符" a. P- `( G8 t& H9 N+ ^
运算符        描述7 G8 U& A1 B, `$ Y
= += -= *= /= %= ^= **=        赋值, n7 f, q9 o7 w! C- I7 M# \) X
?:        C条件表达式
8 X. O; v& l+ P8 C  j||        逻辑或
. a9 ^! R0 r+ K8 O6 F&&        逻辑与. W8 c$ H9 R  S2 z8 C& m/ v- c2 o
~ 和 !~        匹配正则表达式和不匹配正则表达式
) x6 G) d9 Y% W2 f< <= > >= != ==        关系运算符
  g) l9 ?0 F, V5 g4 K9 G# I# ?" L空格        连接
7 N+ U  q  Z  m$ W1 U$ m+ -        加,减
, f' ~! T" P8 Q* c4 Z& v* / %        乘,除与求余7 k& d) t  Y& \( e- R6 _
+ - !        一元加,减和逻辑非
8 T( b7 ~* |* }: a3 {* m^ ***        求幂
" ?" |( U2 l& V' R, T: `++ --        增加或减少,作为前缀或后缀, r3 l! R4 L% d  E# b! J- R& N
$        字段引用
' m( a$ H# _! ]% ^in        数组成员
( ~! b" s# \4 q$ Y5 r5 O8 u4 `3 ]2 Y0 G5 j过滤第一列大于2的行% Q. i7 w7 R1 v" y5 `3 l/ F; ]' C

' O: ?3 ~8 F( H1 S! Q& \6 {$ awk '$1>2' log.txt    #命令
: a5 ?. i% h- U3 d#输出* I! @- p& X4 S% H; h
3 Are you like awk
! O! \$ e5 J1 v5 @0 T7 B1 e# VThis's a test1 k; }9 Z# h4 Y6 s2 ?  l! A
10 There are orange,apple,mongo
4 U: Y% L/ d+ {" V1 y" v过滤第一列等于2的行
; z3 Z/ o( m- @% \9 f) A
: ?3 f! ]4 Z9 g. l) m$ awk '$1==2 {print $1,$3}' log.txt    #命令8 m4 j+ P! y4 m4 L3 b
#输出
& @, P) \9 W* m! w& h$ U& R& V+ P2 is. I3 k# {3 E* p. M
过滤第一列大于2并且第二列等于'Are'的行
* v/ Q1 w' o5 Y0 [* M9 ^8 j$ m0 x& q; g8 o3 L; [6 A
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令) k1 M* v! u1 J' b" T6 a+ [
#输出
. g* \( l, n7 ?, j: Z/ G$ R8 f% V3 Are you8 |% O. O* v; H9 |
内建变量
* [; i' `* |  B; }. S6 `变量        描述" v# h5 P9 g9 D, d2 q. `; k5 ~9 ~
$n        当前记录的第n个字段,字段间由FS分隔- v& ^: T* a; M9 x
$0        完整的输入记录4 d# w8 [# r* g9 t3 B- z0 K2 ?
ARGC        命令行参数的数目0 g  s: v+ h5 F
ARGIND        命令行中当前文件的位置(从0开始算)
9 n0 A; U7 t) Q7 O( k7 S$ }ARGV        包含命令行参数的数组* g. B3 ^5 G* `! U1 |; M; i2 p& B
CONVFMT        数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
  P+ T: |+ F/ c* w$ m! M. k8 PERRNO        最后一个系统错误的描述
+ {4 Y  q8 S$ |9 I9 G: @7 IFIELDWIDTHS        字段宽度列表(用空格键分隔)" M) d7 }( V3 i+ v( M
FILENAME        当前文件名
/ k: x, M% D, ?5 q& A$ VFNR        各文件分别计数的行号7 {6 ]# ~% D  s. R
FS        字段分隔符(默认是任何空格)+ {  M. V; N1 \7 y$ B1 x1 \
IGNORECASE        如果为真,则进行忽略大小写的匹配' u7 y' a3 I$ p+ T* a7 t0 V: Z! t
NF        一条记录的字段的数目
5 [+ V2 S6 ~8 J* kNR        已经读出的记录数,就是行号,从1开始* P, w( `% N' p) x3 E
OFMT        数字的输出格式(默认值是%.6g)
3 }: S/ _& B# E, GOFS        输出字段分隔符,默认值与输入字段分隔符一致。
+ }) F2 A9 m, Q/ Z/ r" QORS        输出记录分隔符(默认值是一个换行符)* i3 s9 a# T1 N0 u7 g% @, K/ m
RLENGTH        由match函数所匹配的字符串的长度
# B' n( F, T$ x/ URS        记录分隔符(默认是一个换行符)  _8 `2 k3 `6 p# G4 m" `& b
RSTART        由match函数所匹配的字符串的第一个位置) v5 H  @9 I: S) I
SUBSEP        数组下标分隔符(默认值是/034)( U9 X. D" u4 ^! e
$ 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.txt$ P3 W7 Y2 l) ^" L% C
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS2 [2 a% M, `9 H( @, H
---------------------------------------------4 e8 d$ M* Y" G( l
log.txt    2    1         5    1/ M' ^9 M( W) }* F1 x- ^
log.txt    2    2         5    2
# a1 d* x+ E" g' ]log.txt    2    3         3    3
; ~9 q  ]5 y3 t6 m6 b$ s- dlog.txt    2    4         4    4
4 ~( v1 e: X+ Z/ K/ f$ 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
% I% J7 {- A6 G$ |, vFILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
. _' O% p& l$ _4 V; R/ g( T$ M---------------------------------------------5 e& R) Q: I' h  N
log.txt    2    1    '    1    1
# K; W' ?& q8 W0 ylog.txt    2    2    '    1    2& t7 C7 v- \0 y1 Y/ P9 z+ k- J
log.txt    2    3    '    2    35 _% @$ i: D. b4 o: R
log.txt    2    4    '    1    4
/ ?5 B/ l- L  a7 p) o# 输出顺序号 NR, 匹配文本行号
4 E+ x$ p8 N( u  D, H$ awk '{print NR,FNR,$1,$2,$3}' log.txt
: ?8 h; m! R, G: z! ~9 H---------------------------------------------
$ k' d2 H8 B: ~" G1 1 2 this is
* L- \+ U' K8 `6 k3 w4 g9 i2 2 3 Are you
8 S- {" T! ~3 Z. o8 }8 k" b. ?3 3 This's a test# ^. s+ y! T5 Z: i0 L( F' d* P* v5 V
4 4 10 There are6 n1 r7 {2 X$ Y4 Z9 F. P
# 指定输出分割符
; L% K: k# j% |+ ^3 F) @$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt  A& g0 j, D- x3 A2 U9 s4 ~$ w
---------------------------------------------
9 V/ k: ^$ y  ~: K2 $ this $ test, j% a# g' k6 z0 q( f
3 $ Are $ awk
. S  j# \! m/ I8 s2 bThis's $ a $
6 Q& E0 I+ A( ~" v  x# }4 ]4 j10 $ There $" _5 A- i/ B$ c, w
使用正则,字符串匹配
4 u! [/ _- u; ^1 c$ n; t5 M# 输出第二列包含 "th",并打印第二列与第四列2 `8 b6 x$ y1 H& {; s; w
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
3 S! G/ a4 I8 N2 C/ E---------------------------------------------
$ Y3 M$ g0 o' S# \% lthis a
$ d9 l  F0 Q; V! u% j( d~ 表示模式开始。// 中是模式。
7 ?1 o8 L% X0 Y2 d1 q) ~) V5 J" m/ U8 n6 j( o2 l" V
# 输出包含 "re" 的行
: t9 p* A3 s/ O6 z: C$ awk '/re/ ' log.txt
2 M$ D( x+ C( A0 Z: i8 B  e- e4 P# M---------------------------------------------
% ^8 w" H  S2 y# C* D3 Are you like awk6 G, Q- z3 K5 s
10 There are orange,apple,mongo
" t2 g/ r& b2 U忽略大小写4 U4 h1 I* H/ j/ j. D
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt$ R* ]: _3 [: c; ]! E5 V$ J) U
---------------------------------------------
( D4 }7 p$ C6 j, v; l: \' c2 this is a test" O8 x0 N7 }7 E9 R
This's a test
0 [+ ]( s7 |6 K% l  a. i" {/ Z模式取反
$ E  q5 y- d' a9 i$ awk '$2 !~ /th/ {print $2,$4}' log.txt
. K$ i2 I2 y1 B7 M. r  f$ Y% y---------------------------------------------/ c: V$ A' F1 u; N  X0 n$ @' ?
Are like
$ A1 s$ |' y0 ka' {8 S/ Y3 g: Q6 V& T) }
There orange,apple,mongo  |* ?, q( L  Q
$ awk '!/th/ {print $2,$4}' log.txt
$ \. Q* D; O4 }" _4 m$ C" c---------------------------------------------
; u. }" A5 n6 I8 A  U  l3 `Are like
- U% r: b/ _8 ka3 P" X+ q# W! b. N; C
There orange,apple,mongo- B6 _( \) V. W" n6 K
awk脚本" o, @- q4 g; A) s: Z
关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。
$ x. ^9 G( }$ ?! ]+ ^, A% W' K* u% b" P0 E; ^  B! b' G
BEGIN{ 这里面放的是执行前的语句 }
# ?4 J: A. H' |+ }' REND {这里面放的是处理完所有的行后要执行的语句 }, q! N% N  n. Z3 R1 u  i& e
{这里面放的是处理每一行时要执行的语句}, ]4 ^) ~- I( _. W/ [; ]
假设有这么一个文件(学生成绩表):
, P/ X- r) `+ h! V. S
/ `3 I& P$ J0 G" x$ H$ cat score.txt
5 c* I( s! G0 MMarry   2143 78 84 778 o; d# ~& p8 a9 U
Jack    2321 66 78 45
3 g( G  |* |$ lTom     2122 48 77 71
, W$ g3 C9 ]. ]- }/ ?, w+ FMike    2537 87 97 95
3 F8 B) e# x0 _$ W' g$ kBob     2415 40 57 62
" x- r4 d- r" i- q9 N3 [' ]" a8 A我们的 awk 脚本如下:: v, M+ q0 L$ }; K6 i( F
: K# {5 j# |( ~, W6 i  g' H
$ cat cal.awk7 d$ C$ a; j3 ^9 O& B& k$ P
#!/bin/awk -f3 H3 E' W8 O$ X/ R+ W. ]
#运行前
; \% ]/ w  `+ ?* o7 mBEGIN {
/ P9 c# z+ J3 p# [    math = 02 o4 B! Q6 E" o. }
    english = 09 F0 k, C1 D' @7 n! {; |, b! b( \
    computer = 0
9 s: {; u# M' a8 Z* h
3 V1 f' ]. m, ^$ e* u( n5 N/ l) E# z# Z6 ^    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"+ ]/ V. b) r1 W1 h& g9 t
    printf "---------------------------------------------\n"
& ?$ x9 l, A7 O0 A" W) T* I. p0 V}
: W: T  q$ v! u/ k! C. w  }. f( |#运行中
9 i% n5 ~3 S" T1 m$ _8 Y{( q- E1 V! s; ^# o% ~
    math+=$3/ X# d- _" q( Q$ `5 G7 @! {% w
    english+=$4
; x/ [* E$ J: b9 T    computer+=$5, J, q5 B8 f! u, C
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
' B, N2 Y$ H3 X: n# y4 p. j# `}
) b. N/ @+ [8 h" [- o9 E: R7 X#运行后
& x; i. m9 ~% \3 g$ L5 ^END {3 }) @9 Z) w% A4 h0 @
    printf "---------------------------------------------\n"
; j* z% ^" Y; q. B8 S2 b$ L8 i1 U! ?    printf "  TOTAL:%10d %8d %8d \n", math, english, computer& B9 j6 R) ]! k; X& I' X
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR; B& i8 R0 P. B# I: b
}
- ?9 A5 ?: ?& B# [' n6 N. R2 Y我们来看一下执行结果:
8 X: p/ e5 r' ~8 R" R1 H* [, o! ?
6 P( N2 i2 a0 e$ awk -f cal.awk score.txt- r' r& y! F. _/ j- E0 a! ^! y- x
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
( e( R! P3 W+ q# S( ~---------------------------------------------  H& Q) U5 u5 c. b. W, R) K
Marry  2143     78       84       77      239
( q  X& ^& }( G& M6 U- m$ GJack   2321     66       78       45      189* O+ H" I- E: D6 Y/ W
Tom    2122     48       77       71      196
8 n+ S" ^3 d9 u7 d; ]; PMike   2537     87       97       95      279+ V  O) I9 M! d) \. C. m) b9 c: M
Bob    2415     40       57       62      1599 E# Q& D: ~* [7 ?- u; }) c2 V+ h
---------------------------------------------5 o9 L+ a/ v& e& n  Z* \# @3 ~; i7 o
  TOTAL:       319      393      350
2 o  I' K/ e1 S" T5 R% sAVERAGE:     63.80    78.60    70.00' X) N4 }# _/ [3 ~- Z
另外一些实例8 b5 D8 D; w& y. e8 {; x7 P
AWK 的 hello world 程序为:" \! n# ]5 y" X1 m

2 [6 w& p/ C; Z8 @' iBEGIN { print "Hello, world!" }# O  r3 z4 ^& o" f( I; ^" C
计算文件大小
+ p) D! E2 E) H# i% ]0 y
. V5 y9 c, c* q& s- |  A  x, U$ ls -l *.txt | awk '{sum+=$5} END {print sum}'
3 r7 i% w, Q2 |; `--------------------------------------------------; u- F6 m1 B/ F' T: L6 ], V
6665818 |2 R3 V+ k6 R- o+ b; e3 f
从文件中找出长度大于 80 的行:1 E  Z) G2 W( D4 g

, y; X* B* K( }  r+ N: Dawk 'length>80' log.txt) ^2 I* i3 V8 A$ C0 a% O( W( Q: G' @
打印九九乘法表+ s" C# n  h: l1 z
) T$ ~" p1 B  c, V
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")}'. k' d" r& O2 `8 ?/ E

该用户从未签到

2#
发表于 2021-9-2 13:45 | 只看该作者
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具

该用户从未签到

3#
发表于 2021-9-2 13:47 | 只看该作者
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符

该用户从未签到

4#
发表于 2021-9-2 13:48 | 只看该作者
AWK是一个强大的文本分析工具
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-18 10:40 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表