十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

Accesslog分析常用命令 awk

上一篇 / 下一篇  2009-05-23 09:34:25 / 个人分类:liunx相关

awk 命令

51Testing软件测试网 t0js8\/Q\ E[`O

D,e]j;I0

用途

在文件中查找与模式匹配的行,然后在它们上面执行特定的操作。51Testing软件测试网OHvde

语法

51Testing软件测试网9rs8i)Y`_K

awk[ -FEre] [ -vAssignment] ... { -fProgramFile|Program'} [ [ File ... | Assignment ... ] ] ...51Testing软件测试网P6eo^*fo m

描述

awk命令利用一组用户提供的指令来将一组文件和用户提供的扩展正则表达式比较,一次一行。然后在任何与扩展正则表达式匹配的行上执行操作。awk处理的最大记录大小为 10KB。51Testing软件测试网.U-_3[.D2]

awk命令的模式搜索比grep命令的搜索更常用,且它允许用户在输入文本行上执行多个操作。awk命令编程语言不需要编译,并允许用户使用变量、数字函数、字符串函数和逻辑运算符。

T T"LH0L%~0FI~ LZ0

awk命令受到LANGLC_ALLLC_COLLATELC_CTYPELC_MESSAGESLC_NUMERICNLSPATHPATH环境变量的影响。51Testing软件测试网 k:p*{Fr5XHV+m-C

本章中包括以下主题:51Testing软件测试网.|:oX&@l1wX n

awk 命令的输入

awk命令采取两种类型的输入:输入文本文件和程序指令。51Testing软件测试网;O/h ~/L$]*o(I&q

输入文本文件

搜索和操作在输入文本文件上执行。文件如下指定:51Testing软件测试网8T(L"l!FJM9fV+GY

  • 在命令行指定File变量。
  • 修改特殊变量ARGVARGC
  • 在未提供File变量的情况下提供标准输入。

如果用File变量指定多个文件,则文件以指定的顺序处理。51Testing软件测试网@,A$_5`i(k

程序指令

用户提供的指令控制awk命令的操作。这些指令来自命令行的‘Program’变量或来自用-f标志和ProgramFile变量一起指定的文件。如果指定多个程序文件,这些文件以指定的顺序串联,且使用指令的生成的顺序。51Testing软件测试网ZB1N"R/S9G[l?

awk 命令的输出

awk命令从输入文本文件中的数据产生三种类型的输出:51Testing软件测试网(ugve.B\7y(^g

  • 选定的数据可以打印至标准输出,此输出完全同于输入文件。
  • 输入文件的选定部分可以更改。
  • 选定数据可以更改并可打印至标准输出,此输出可以同于或不同于输入文件的内容。

可以在同一个文件上执行所有三种类型的输出。awk命令识别的编程语言允许用户重定向输出。

!BXy~$m2G!jv+f0

通过记录和字段的文件处理

文件以下列方式处理:51Testing软件测试网y1R*x!V!|/w{3vpE8U

  1. awk命令扫描它的指令,并执行任何指定为在读取输入文件前发生的操作。

    awk编程语言中的BEGIN语句允许用户指定在读取第一个记录前要执行的一组指令。这对于初始化特殊变量特别有用。51Testing软件测试网'I)E9vc#w1H\4`

  2. 从输入文件读取一个记录。

    记录是由记录分隔符隔开的一组数据。记录分隔符的缺省值是换行字符,它使文件中的每一行成为一个单独的记录。记录分隔符可以通过设置RS特殊变量来更改。

    %c&^1GG3u)U0
  3. 记录是相对于awk命令的指令指定的每种模式比较。

    命令指令可以指定应比较记录内的特定字段。缺省情况下,字段由空白区(空格或跳格)隔开。每个字段由一个字段变量表示。记录中的第一个字段指定为$1变量,第二个字段指定为$2变量,以此类推。整个记录指定为$0变量。字段分隔符可以通过在命令行使用-F标志或通过设置FS特殊变量来更改。FS特殊变量可以设置为下列值:空格、单个字符或扩展正则表达式

    3I H4e/?(J:q0
  4. 如果一个记录与一个模式相匹配,则任何与该模式相关的操作都在该记录上执行。
  5. 在记录和每个模式比较且执行了所有指定操作以后,从输入读取下一个记录;在从输入文件读取所有的记录之前,该进程重复。
  6. 如果已经指定了多个输入文件,则下一个文件打开,且在读取所有的输入文件之前,该进程重复。
  7. 在读取了最后一个文件中的最后一个记录后,awk命令执行任何指定为在输入处理后发生的指令。

    awk编程语言中的END语句允许用户指定在读取最后一个记录后要执行的操作。这对于发送有关awk命令完成了什么工作的消息特别有用。

    0GD-`2l;kw-S0@,kd e5f0

awk 命令编程语言

awk命令编程语言由以下格式的语句构成:51Testing软件测试网]q0lj}h

Pattern{Action}51Testing软件测试网 wB*_;iDIU

如果一个记录与指定模式相匹配,或包含与该模式匹配的字段,则执行相关的操作。可以指定没有操作的模式,这种情况下,包含该模式的整行写至标准输出。为每个输入记录执行指定的没有模式的操作。51Testing软件测试网0i(l;s,K g9D kG{ WC

模式

awk命令语言语法中使用四种类型的模式:

w!h6s8MrA0

正则表达式

awk命令使用的扩展正则表达式类似于grepegrep命令使用的表达式。扩展正则表达式的最简单的形式就是包括在斜杠中的一串字符。例如,假定一个名为testfile的文件具有以下内容:51Testing软件测试网)t!_#Wt m5AQ6H

7DU1fP&}H$e D051Testing软件测试网*s6aiI(J.c%P

smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

输入以下一行命令:

:B)^ U_:Y6n M q0

%m"[ c+V)BN eL051Testing软件测试网QX~!Yp K,q/z

awk '/smi/' testfile

将把包含smi字符串的具体值的所有记录打印至标准输出。在这个示例中,awk命令的程序'/smi/'是一个没有操作的模式。输出是:51Testing软件测试网.tWn^0Z

51Testing软件测试网1yKC jz-C j4B

51Testing软件测试网r {'~0G&}f

smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

以下特殊字符用于形成扩展正则表达式:51Testing软件测试网 i%|h+B5i pr4M

字符功能
+指定如果一个或多个字符或扩展正则表达式的具体值(在+(加号)前)在这个字符串中,则字符串匹配。命令行:

d#W*J ~v3JC&Y}+^/z0

~ kvW8|o0
awk '/smith+ern/' testfile

将包含字符smit,后跟一个或多个h字符,并以字符ern结束的字符串的任何记录打印至标准输出。此示例中的输出是:51Testing软件测试网Qpl lGb^8Y

51Testing软件测试网"]Gp&a0Q1ic

DL.E(fn|}] @pB0
smithern, harry
smithhern, anne
?指定如果零个或一个字符或扩展正则表达式的具体值(在 ?(问号)之前)在字符串中,则字符串匹配。命令行:

#gt1q3H |;~(w~'c;}051Testing软件测试网/W2g7AyK qGm

awk '/smith?/' testfile

将包含字符smit,后跟零个或一个h字符的实例的所有记录打印至标准输出。此示例中的输出是:

-kZ0W7R+dJ \O051Testing软件测试网A r0[ @O

d_(bhb7e]0
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
|指定如果以 |(垂直线)隔开的字符串的任何一个在字符串中,则字符串匹配。命令行:51Testing软件测试网A[D3HMK'}

51Testing软件测试网.H0_5|tU&o C

awk '/allen 
| 
alan /' testfile

将包含字符串allenalan的所有记录打印至标准输出。此示例中的输出是:51Testing软件测试网iX1LJ O-^

51Testing软件测试网/GFR+j h6ks

+vt+Q;|t/t?0
smiley, allen
smith, alan
( )在正则表达式中将字符串组合在一起。命令行:51Testing软件测试网4w)^pn#ns S1^

51Testing软件测试网k&GKxpsy{~UY

awk '/a(ll)?(nn)?e/' testfile

将具有字符串aealleanneallnne的所有记录打印至标准输出。此示例中的输出是:

1t6{-i&\ j2]hl051Testing软件测试网5k$Q ?3@0L:{t

)^Hy2b1dK0
smiley, allen
smithhern, anne
{m}指定如果正好有m个模式的具体值位于字符串中,则字符串匹配。命令行:

VG]/Jl$_M0

,`'v+B5lWO/Ly'}0
awk '/l{2}/' testfile

打印至标准输出51Testing软件测试网Je2M$xE%n(X2N;KUR

*r#^!{"W\G051Testing软件测试网BWK;z#X8@[f+v

smiley, allen
{m,}指定如果至少m个模式的具体值在字符串中,则字符串匹配。命令行:

Y5NP_u+L\#a-Tw E0

k rZ-Rt X*L3h0
awk '/t{2,}/' testfile

打印至标准输出:

R[D1o+[V5[0

b:d KT)L`*q"fD051Testing软件测试网"t&M!? s%sXp)O

smitters, alexis
{m, n}指定如果mn之间(包含的 m 和 n)个模式的具体值在字符串中(其中m<=n),则字符串匹配。命令行:51Testing软件测试网5K mV`U-V-L[,?

&B!U k n\P,@Bv0
awk '/er{1, 2}/' testfile

打印至标准输出:51Testing软件测试网u Dv6o RLK,q&yG

9@)dc&_ {%G0

'px~1`u0
smithern, harry
smithern, anne
smitters, alexis
[String]指定正则表达式与方括号内String变量指定的任何字符匹配。命令行:51Testing软件测试网#gL} |-f7X

51Testing软件测试网ch x4n0jv;Q

awk '/sm[a-h]/' testfile

将具有sm后跟以字母顺序从ah排列的任何字符的所有记录打印至标准输出。此示例的输出是:51Testing软件测试网d ^](l5jV-Pj)C

UBe2|$] |0

/Q:g+Kc-t3Y t0
smawley, andy
[^String]在 [ ](方括号)和在指定字符串开头的 ^ (插入记号) 指明正则表达式与方括号内的任何字符匹配。这样,命令行:

vD pG$^U/RS0

;?t&oK7o"{L*iA0
awk '/sm[^a-h]/' testfile

打印至标准输出:51Testing软件测试网%W F9^ b(K[(efaV

51Testing软件测试网3|K.A1]?0l

d2S rj\p0
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
~,!~表示指定变量与正则表达式匹配(代字号)或不匹配(代字号、感叹号)的条件语句。命令行:51Testing软件测试网8`6_1@7o iA

51Testing软件测试网WF:O;U Pu#U`o

awk '$1 ~ /n/' testfile

将第一个字段包含字符n的所有记录打印至标准输出。此示例中的输出是:

Svl-xm+sp*` l#s0

af"I*p0W+t2R051Testing软件测试网 e_1GG(Y {0w-a(d`

smithern, harry
smithhern, anne
^指定字段或记录的开头。命令行:

wSZ{:@'D[2M051Testing软件测试网 `J9P'f@r

awk '$2 ~ /^h/' testfile

将把字符h作为第二个字段的第一个字符的所有记录打印至标准输出。此示例中的输出是:51Testing软件测试网5~*o"qFsC8qI]^0B

g h'r2d{5z)Q051Testing软件测试网)F'A7TL%Zg5[r5I

smithern, harry
$指定字段或记录的末尾。命令行:51Testing软件测试网9TyD[2Zq!rF rI

51Testing软件测试网'Iu7k$e0C6nXb w

awk '$2 ~ /y$/' testfile

将把字符y作为第二个字段的最后一个字符的所有记录打印至标准输出。此示例中的输出是:51Testing软件测试网zb(WQ$J|.c0N

Wy'k"~"E!B nR051Testing软件测试网 V-f;~'SB,G;O0w[

smawley, andy
smithern, harry
.(句号)表示除了在空白末尾的终端换行字符以外的任何一个字符。命令行:51Testing软件测试网r/ks2h [u"Z5P R

z~I&S%P9h8tO;C0
awk '/a..e/' testfile

将具有以两个字符隔开的字符a和 e 的所有记录打印至标准输出。此示例中的输出是:51Testing软件测试网8nq"jC#X"r

51Testing软件测试网/j7G4S9|%NT,};?1x6xr

Zyr%Z!K&ER;r&W0
smawley, andy
smiley, allen
smithhern, anne
*(星号)表示零个或更多的任意字符。命令行:51Testing软件测试网X(Z2s Hh5Z.j

vuDjY6Q0[ ~0M0
awk '/a.*e/' testfile

将具有以零个或更多字符隔开的字符a和 e 的所有记录打印至标准输出。此示例中的输出是:51Testing软件测试网2csi}Zh

P[ CY-Z2~@ dZ%h0

I}3p\L|4? RBW b0
smawley, andy
smiley, allen
smithhern, anne
smitters, alexis
\(反斜杠)转义字符。当位于在扩展正则表达式中具有特殊含义的任何字符之前时,转义字符除去该字符的任何特殊含义。例如,命令行:

(U9z"D uY4`"Q0

+cWTATdU6q7u0
/a\/\//

将与模式 a // 匹配,因为反斜杠否定斜杠作为正则表达式定界符的通常含义。要将反斜杠本身指定为字符,则使用双反斜杠。有关反斜杠及其使用的更多信息,请参阅以下关于转义序列的内容。51Testing软件测试网gXm+G.q

识别的转义序列

awk命令识别大多数用于 C 语言约定中的转义序列,以及awk命令本身用作特殊字符的几个转义序列。转义序列是:51Testing软件测试网1Zy y%vKi

转义序列表示的字符
\"\"(双引号)标记
\//(斜杠)字符
\ddd其编码由 1、2 或 3 位八进制整数表示的字符,其中d表示一个八进制数位
\\\ ( 反斜杠 ) 字符
\a警告字符
\b退格字符
\f换页字符
\n换行字符(请参阅以下的注)
\r回车字符
\t跳格字符
\v垂直跳格
51Testing软件测试网4s/pSmL

51Testing软件测试网W6R Ic j3b

注:除了在gsubmatchsplitsub内置函数中,扩展正则表达式的匹配都基于输入记录。记录分隔符字符(缺省情况下为换行字符)不能嵌套在表达式中,且没与记录分隔符字符匹配的表达式。如果记录分隔符不是换行字符,则可与换行字符匹配。在指定的四个内置函数中,匹配基于文本字符串,且任何字符(包含记录分隔符)可以嵌套在模式中,这样模式与适当的字符相匹配。然而,用awk命令进行的所有正则表达式匹配中,在模式使用一个或多个 NULL(空)字符将生成未定义的结果。

关系表达式

关系运算符 <(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)、= =(等于)和 !=(不等于)可用来形成模式。例如,模式:51Testing软件测试网h-F"]}Pbxu

x&O(F.Cj%f7l0

,bZ3kZl(N$n}0
$1 < $4

将与第一个字段小于第四个字段的记录匹配。关系运算符还和字符串值一起使用。例如:

m8VH2n3{k3k0

tnMq/b#] B&l051Testing软件测试网 BTYW6tsS^f

$1 =! "q"

将与第一个字段不是q的所有记录匹配。字符串值还可以根据校对值匹配。例如:

To-Np"O n&d0lr3_051Testing软件测试网DkvI/v#{

51Testing软件测试网1G6Jp0H9HB,O8m

$1 >= "d"

将与第一个字段以字符abcd开头的所有记录匹配。如果未给出其它信息,则字段变量作为字符串值比较。

:prc$q'{0

模式的组合

可以使用三种选项组合模式:51Testing软件测试网3s C i Q6p] PV sm

  • 范围由两种以 ,(逗号)隔开的模式指定。操作在每个以匹配第一个模式的记录开始的每个记录上执行,并通过匹配第二个模式的记录(包含此记录)继续。例如:51Testing软件测试网d a {W-L l n)e

    51Testing软件测试网Ju5A9huR4l{

    /begin/,/end/

    与包含字符串begin的记录以及该记录和包含字符串end之间的所有记录(包含包括字符串end的记录)匹配。

    3l4ReGQGAUi m0
  • 括号 ( ) 将模式组合在一起。
  • 布尔运算符 ||(或)&&(和)以及 !(不)将模式组合成如果它们求值为真则匹配,否则不匹配的表达式。例如,模式:51Testing软件测试网L#@4D{?(q

    #r DHowDR0
    $1 == "al" && $2 == "123"

    与第一个字段是al且第二个字段是123的记录匹配。51Testing软件测试网UrSC.F}AF

BEGIN 和 END 模式

BEGIN模式指定的操作在读取任何输入之前执行。用END模式指定的操作在读取了所有输入后执行。允许多个BEGINEND模式,并以指定的顺序处理它们。在程序语句中END模式可以在BEGIN模式之前。如果程序仅由BEGIN语句构成,则执行操作且不读取输入。如果程序仅由END语句构成,则在任何操作执行前读取所有输入。

$] X$Hxs*{0

操作

有多种类型的操作语句:51Testing软件测试网 Z-xA1N&Qk+O(f\

操作语句

操作语句括在 { } (花括号) 中。如果语句指定为没有模式,则它们在每个记录上执行。在括号里可以指定多个操作,但操作间必须以换行字符或 ;(分号)分隔,且语句以它们出现的顺序处理。操作语句包含:

_r9Vo*w!qD-l_0
算术语句
算术运算符 +(加号), - (减号), / (除号), ^ (幂), * (乘号), % (系数)用于格式:

%S*ik+m Z4Fe,}4A/s0

*Qtf K)p|0
表达式 运算符 表达式

这样,语句:51Testing软件测试网a*BY+m$sq

51Testing软件测试网@!C t uD"A0@"DxH'FY

0@)`R:r L9jwy`v0
$2 = $1^3

将第一个升为三次方的字段的值指定给第二个字段。51Testing软件测试网4h\ H|"{b"K

一元语句
一元-(减号)和一元+(加号)如在 C 编程语言中操作:

T8X/c"I r Z'fz6che&LG051Testing软件测试网7w#a5LFV5OKu;d

+Expression 或 -Expression
增量和减量语句
增量前语句和减量前语句如在 C 编程语言中操作:

$h2CyJ6rU? Il-T0

cb? \T4|0
++Variable 或 --Variable

增量后语句和减量后语句如在 C 编程语言中操作:51Testing软件测试网%|.wn+iu R.?

51Testing软件测试网G1I ]A[$|;R_|

51Testing软件测试网 O-JE{0]$Bi }I R

Variable++ 或 Variable--
赋值语句
赋值运算符 +=(加)、-=(减)、/=(除)和 *=(乘)如在 C 编程语言中操作,格式为:51Testing软件测试网0di@_:\1M'L{

;R;Lus.JK]^$d0
Variable += Expression

G0Y ZoF6N d0
Variable -= Expression

51Testing软件测试网(VxgR%TK3d^Z%K

Variable /= Expression

51Testing软件测试网#|iMVC DB!B] f

Variable *= Expression

例如,语句:

`6`-B6Ikn LI+P E051Testing软件测试网'w;Z\V`6bm

aR i&}'\3fa J-Y(M0
$1 *= $2

将字段变量$1乘以字段变量$2,然后将新值指定给$1

&Zc8tK&Zn0

赋值运算符 ^=(幂)和 %=(系数)具有以下格式:

Z cP{Y9I#i1J(G051Testing软件测试网 |%e)X1^:FO)e(E

8_6{;k3B)_9A2h0
Variable1^=Expression1

51Testing软件测试网8iG'Qhc$KeZ

51Testing软件测试网.q9y3u}u8GZ

51Testing软件测试网+W Q!|2k&c*g

Variable2%=Expression2

并且它们等同于 C 编程语言语句:51Testing软件测试网j$@z op m+bw

Ca9s RG#A!RZ0

}1Ru ?2d/\W0
Variable1=pow(Variable1, Expression1)

kqg zov(UU(Y051Testing软件测试网pb+JOF9l}

"jJ4yS[+iD0
Variable2=fmod(Variable2, Expression2)

其中powpow子例程而fmodfmod子例程。51Testing软件测试网qqU^,V n

字符串串联语句
字符串值可以通过紧挨着陈述来串联。例如:

5~P(^%J x}Vi/UP051Testing软件测试网h T6A/yMnMV

$3 = $1 $2

将字段变量$1$2中的字符串的串联指定给字段变量$351Testing软件测试网zt?"?.ba"x

内置函数

awk命令语言使用算术函数、字符串函数和一般函数。如果打算编写一个文件,且稍后在同一个程序里读取它,则 close 子例程语句是必需的。51Testing软件测试网*X&N%wvS

算术函数

以下算术函数执行与 C 语言中名称相同的子例程相同的操作:51Testing软件测试网(\c:O;[J,h

atan2(y,x)返回y/x的反正切。
cos(x)返回x的余弦;x是弧度。
sin(x)返回x的正弦;x是弧度。
exp(x)返回x幂函数。
log(x)返回x的自然对数。
sqrt(x)返回x平方根。
int(x)返回x的截断至整数的值。
rand()返回任意数字n,其中 0 <=n< 1。
srand([Expr])rand函数的种子值设置为Expr参数的值,或如果省略Expr参数则使用某天的时间。返回先前的种子值。
字符串函数

字符串函数是:

2Lz9Ku3V7^!~ ]q0
gsub(Ere,Repl, [In])除了正则表达式所有具体值被替代这点,它和sub函数完全一样地执行,。
sub(Ere,Repl, [In])Repl参数指定的字符串替换In参数指定的字符串中的由Ere参数指定的扩展正则表达式的第一个具体值。sub函数返回替换的数量。出现在Repl参数指定的字符串中的 &(和符号)由In参数指定的与Ere参数的指定的扩展正则表达式匹配的字符串替换。如果未指定In参数,缺省值是整个记录($0记录变量)。
index(String1,String2)在由String1参数指定的字符串(其中有出现String2指定的参数)中,返回位置,从 1 开始编号。如果String2参数不在String1参数中出现,则返回 0(零)。
length [(String)]返回String参数指定的字符串的长度(字符形式)。如果未给出String参数,则返回整个记录的长度($0记录变量)。
blength [(String)]返回String参数指定的字符串的长度(以字节为单位)。如果未给出String参数,则返回整个记录的长度($0记录变量)。
substr(String,M, [N])返回具有N参数指定的字符数量子串。子串从String参数指定的字符串取得,其字符以M参数指定的位置开始。M参数指定为将String参数中的第一个字符作为编号 1。如果未指定N参数,则子串的长度将是M参数指定的位置到String参数的末尾的长度。
match(String,Ere)String参数指定的字符串(Ere参数指定的扩展正则表达式出现在其中)中返回位置(字符形式),从 1 开始编号,或如果Ere参数不出现,则返回 0(零)。RSTART特殊变量设置为返回值。RLENGTH特殊变量设置为匹配的字符串的长度,或如果未找到任何匹配,则设置为 -1(负一)。
split(String,A, [Ere])String参数指定的参数分割为数组元素A[1],A[2], . . .,A[n],并返回n变量的值。此分隔可以通过Ere参数指定的扩展正则表达式进行,或用当前字段分隔符(FS特殊变量)来进行(如果没有给出Ere参数)。除非上下文指明特定的元素还应具有一个数字值,否则A数组中的元素用字符串值来创建。
tolower(String)返回String参数指定的字符串,字符串中每个大写字符将更改为小写。大写和小写的映射由当前语言环境的LC_CTYPE范畴定义。
toupper(String)返回String参数指定的字符串,字符串中每个小写字符将更改为大写。大写和小写的映射由当前语言环境的LC_CTYPE范畴定义。
sprintf(Format,Expr,Expr,. . .)根据Format参数指定的printf子例程格式字符串来格式化Expr参数指定的表达式并返回最后生成的字符串。
一般函数

一般函数是:51Testing软件测试网*@"r"Jm?3V T)bQ

close(Expression)用同一个带字符串值的Expression参数来关闭由printprintf语句打开的或调用getline函数打开的文件或管道。如果文件或管道成功关闭,则返回 0;其它情况下返回非零值。如果打算写一个文件,并稍后在同一个程序中读取文件,则close语句是必需的。
system(Command)执行Command参数指定的命令,并返回退出状态。等同于system子例程。
Expression|getline[Variable]从来自Expression参数指定的命令的输出中通过管道传送的流中读取一个输入记录,并将该记录的值指定给Variable参数指定的变量。如果当前未打开将Expression参数的值作为其命令名称的流,则创建流。创建的流等同于调用popen子例程,此时Command参数取Expression参数的值且Mode参数设置为一个是r的值。只要流保留打开且Expression参数求得同一个字符串,则对getline函数的每次后续调用读取另一个记录。如果未指定Variable参数,则$0记录变量和NF特殊变量设置为从流读取的记录。
getline[Variable]<ExpressionExpression参数指定的文件读取输入的下一个记录,并将Variable参数指定的变量设置为该记录的值。只要流保留打开且Expression参数对同一个字符串求值,则对getline函数的每次后续调用读取另一个记录。如果未指定Variable参数,则$0记录变量和NF特殊变量设置为从流读取的记录。
getline[Variable]Variable参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定Variable参数,则$0记录变量设置为该记录的值,还将设置NFNRFNR特殊变量。

4V1^3l*](lk;O zJ051Testing软件测试网wc1^A#BhCp8[5d7h]

注:所有getline函数的格式对于成功输入返回 1,对于文件结束返回零,对于错误返回 -1。

用户定义的函数

用户定义的函数以下列格式说明:51Testing软件测试网R l D!|&p7Q

51Testing软件测试网0RF-BX M}]

4MA K/EKD#s2`9u0
function Name (Parameter, Parameter,...)  { Statements }

函数可以指向awk命令程序中的任何位置,且它的使用可以优先于它的定义。此函数的作用域是全局的。

k @z NG0

函数参数可以是标量或数组。参数名称对函数而言是本地的;所有其它变量名称都是全局的。同一个名称不应用作不同的实体;例如,一个参数名称不能用作函数名称又用作特殊变量。具有全局作用域的变量不应共享一个函数的名称。同个作用域中的标量和数组不应具有同一个名称。51Testing软件测试网o%R-S{6V,[

函数定义中的参数数量不必和调用函数时使用的参数数量匹配。多余的形式参数可用作本地变量。额外的标量参数初始化后具有等同于空字符串和数字值为 0(零)的字符串值;额外的数组参数初始化为空数组。

{#[+Q4Jh0

当调用函数时,函数名称和左括号之间没有空格。函数调用可以是嵌套的或循环的。从任何嵌套的或循环函数函数调用返回时,所有调用函数的参数的值应保持不变,除了引用传送的数组参数。return语句可用于返回一个值。

8Z1oY6Pr d0

在函数定义内,在左 { ( 花括号 ) 之前和右 } ( 花括号 ) 之后的换行字符是可选的。

V'EH o ZH h0

函数定义的一个示例是:51Testing软件测试网.J)c'v&ILu

51Testing软件测试网 d9n\t+P F

51Testing软件测试网n+KPY?0l3Ef{W

functionaverage ( g,n) 
  {
        for (i in g)
           sum=sum+g[i]
        avg=sum/n
        return avg
  }

数组g和变量n以及数组中的元素个数传递给函数 average。然后函数获得一个平均值并返回它。51Testing软件测试网T4F+}+P7o7L yavIx7Px

条件语句

awk命令编程语言中的大部分条件语句和 C 编程语言中的条件语句具有相同的语法和功能。所有条件语句允许使用{ } (花括号) 将语句组合在一起。可以在条件语句的表达式部分和语句部分之间使用可选的换行字符,且换行字符或 ;(分号)用于隔离 { } (花括号) 中的多个语句。C 语言中的六种条件语句是:

u |6S T(Bl&{7?0
if需要以下语法:

\-d,RTdM]wLH+{0if(Expression) {Statement }[elseAction]

Xeg;WD:fpf0
while需要以下语法:51Testing软件测试网 t(A@uq4\YcSA["J

while(Expression) {Statement}

z6u jFu#H8Ob[0
for需要以下语法:51Testing软件测试网:v l1NHnfW&d]'G

for(Expression;Expression;Expression) {Statement}

^6y#\#?\Z8m0X0
breakbreak语句用于whilefor语句时,导致退出程序循环。
continuecontinue语句用于whilefor语句时,使程序循环移动到下一个迭代。

awk命令编程语言中的五种不遵循 C 语言规则的条件语句是:

s#H W2a)c:y ~)^0
for...in需要以下语法:51Testing软件测试网K;C{S.l,`M-LYI~$z

for(VariableinArray) {Statement}51Testing软件测试网 u m6YY6o3R/Z

NPV:l%L|v0for...in语句将Variable参数设置为Array变量的每个索引值,一次一个索引且没有特定的顺序,并用每个迭代来执行Statement参数指定的操作。请参阅delete语句以获得for...in语句的示例。

0oF(EmJvq0
if...in需要以下语法:

:S-m4bO-dB'q0if(VariableinArray) {Statement}51Testing软件测试网/`)d:T:c8Z

Fl _)q Z-xaS0if...in语句搜索是否存在的Array元素。如果找到Array元素,就执行该语句。

8v l*j Ih![0W,scI#g1W0
delete需要以下语法:51Testing软件测试网 l'X]:gAm*s

deleteArray[Expression]

hd_bR?'i1c0

delete语句删除Array参数指定的数组元素和Expression参数指定的索引。例如,语句:

RN"dS_5Y#r N051Testing软件测试网FG a{M c

51Testing软件测试网kut)]nO4u

for (i in g)
   delete g[i];

将删除g[]数组的每个元素。

k(z:a{/`&`0
exit需要以下语法:

T}N%]1N#r5OW0exit[Expression]51Testing软件测试网FP!IYrX*V

exit语句首先调用所有END操作(以它们发生的顺序),然后以Expression参数指定的退出状态终止awk命令。如果exit语句在END操作中出现,则不调用后续END操作。51Testing软件测试网k3dra@ d

#需要以下语法:

y8D [J y}uP([/K0#Comment51Testing软件测试网 {6_bNq

#语句放置注释。注释应始终以换行字符结束,但可以在一行上的任何地方开始。

]0qYQxfe:wlIrI0
next停止对当前输入记录的处理,从下一个输入记录继续。

输出语句

awk命令编程语言的两种输出语句是:

}.QhB#NZJ ~ TqeW0
print需要以下语法:51Testing软件测试网A+DW#imz8s

print[ExpressionList] [Redirection] [Expression]

"O#G{r4]0Q%H.kr9_q0

print语句将ExpressionList参数指定的每个表达式的值写至标准输出。每个表达式由OFS特殊变量的当前值隔开,且每个记录由ORS特殊变量的当前值终止。

P u!r,c7qqn$zL0

可以使用Redirection参数重定向输出,此参数可指定用 >(大于号)、>>(双大于号)和 |(管道)进行的三种输出重定向。Redirection参数指定如何重定向输出,而Expression参数是文件的路径名称(当Redirection参数是 > 或 >> 时)或命令的名称(当Redirection参数是 | 时)。51Testing软件测试网^4{4sGdT_

printf需要以下语法:51Testing软件测试网C(w `D6\nvZ C

printfFormat[ ,ExpressionList] [Redirection] [Expression]51Testing软件测试网!T @s#a*g

printf语句将ExpressionList参数指定的表达式以Format参数指定的格式写至标准输出。除了c转换规范(%c)不同外,printf语句和printf命令起完全相同的作用。RedirectionExpression参数与在print语句中起相同的作用。51Testing软件测试网$@4h/C ` jgET

8oS`'q9n D3v h0对于c转换规范:如果自变量具有一个数字值,则编码是该值的字符将输出。如果值是零或不是字符集中的任何字符的编码,则行为未定义。如果自变量不具有数字值,则输出字符串值的第一个字符;如果字符串不包含任何字符,则行为未定义。51Testing软件测试网8D{ A#L}`

51Testing软件测试网cCF%d4KO]

51Testing软件测试网I)A@]%Fj?&@ p

注:如果Expression参数为Redirection参数指定一个路径名称,则Expression参数将括在双引号中以确保将它当作字符串对待。

变量

变量可以是标量、字段变量、数组或特殊变量。变量名称不能以数字开始。51Testing软件测试网'veW Pou L4Dq4H

变量可仅用于引用。除了函数参数以外,它们没有明确说明。未初始化的标量变量和数组元素具有一个为 0(零)的数字值和一个为空字符串(" ")的字符串值。51Testing软件测试网U|OSKU,{

根据上下文,变量呈现出数字或字符串值。每个变量可以具有数字值和/或字符串值。例如:51Testing软件测试网0i}+M5d{7[

(lW#w?$o:r0zsH]0

)pT,{1jb!P Le#N0
x = "4" + "8"

将值12指定给变量x。对于字符串常量,表达式应括在 " "(双引号)标记中。51Testing软件测试网bdp@;\3Wc

数字和字符串间没有显式转换。要促使将表达式当作一个数字,向它添加 0(零)。要促使将表达式当作一个字符串,则添加一个空字符串(" ")。51Testing软件测试网&e.q E!Z Xk A

字段变量

字段变量由$(美元符号)后跟一个数字或数字表达式来表示。记录中的第一个字段指定为$1变量,第二个字段指定为$2,以次类推。$0字段变量指定给整个记录。新字段可以通过指定一个值给它们来创建。将一个值指定给不存在的字段(即任何大于$NF字段变量的当前值的字段)将促使创建任何干扰字段(指定为空字符串),增加NF特殊变量的值,并促使重新计算$0记录变量。新字段由当前字段分隔符(FS特殊变量的值)隔开。空格和跳格是缺省字段分隔符。要更改字段分隔符,请使用-F标志或 在awk命令程序中为FS特殊变量指定另一个值。51Testing软件测试网3GC U {&G

数组

数组初始为空且它们大小可动态更改。数组由一个变量和在 [ ](方括号)中的下标来表示。下标或元素标识符可以是几个字符串,它们提供了一种相关数组能力。例如,程序:51Testing软件测试网?1n1pE*cLj3T(IUz

51Testing软件测试网6rY6^s0Uz

eT$AYJ-F8S:yz0
/red/  { x["red"]++ }
/green/ { y["green"]++ }

增加red计数器和green计数器的计数。51Testing软件测试网`ml(qyv

数组可以用一个以上的下标来建立索引,类似于一些编程语言中的多维数组。因为awk命令的编程数组实际上是一维的,通过串联各独立表达式的字符串值(每个表达式由SUBSEP环境变量的值隔开)来将以逗号隔开的下标转换为单个字符串。所以,以下两个索引操作是等同的:51Testing软件测试网:|9V;S@:g C3wQ

51Testing软件测试网r9zw tOV3D!]qH

Jn,z~,go9Xs'i2f"P0
x[expr1, expr2,...exprn]
51Testing软件测试网}{2ovO6g

,F }2~)HE/J9_gNV%@051Testing软件测试网2I{ _ vw

Tr(XDj$AOq_ [.gh0
x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]

当使用in运算符时,一个多维Index值应包含在圆括号之中。除了in运算符,任何对不存在数组元素的引用将自动创建该元素。51Testing软件测试网@}/H1Q1gb;wd8F\

特殊变量

以下变量对于awk命令具有特殊含义:

z-t#c oy b:`.Qehu0
ARGCARGV数组中的元素个数。此值可以更改。
ARGV其每个成员包含File变量之一或Assignment变量之一的数组按序从命令行取出,并从 0(零)编号至ARGC-1。当每个输入文件完成时,ARGV数组的下一个成员提供下一个输入文件的名称,除非:
  • 下一个成员是Assignment语句,这种情况下对赋值求值。
  • 下一个成员具有空值,这种情况下跳过该成员。程序可以通过设置ARGV数组的包含该输入文件的成员设置为一个空值来跳过所选的输入文件。
  • 下一个成员是ARGV[ARGC-1] 的当前值,awk命令将此成员解释为输入文件的末尾。
CONVFMT将数字转换为字符串的printf格式(除了使用OFMT特殊变量的输出语句)。缺省值为“%.6g”。
ENVIRON表示运行awk命令的环境的数组。该数组的每个元素在以下格式中:

ENVIRON["Environment VariableName"]=EnvironmentVariableValue51Testing软件测试网$O p s1O I!OY/XK

awk命令开始执行时设置这些值,且到执行结束前一直使用该环境,不考虑ENVIRON特殊变量的任何修改。

Y)U7xuW$_(o0
FILENAME当前输入文件的路径名称。在执行BEGIN操作的过程中,FILENAME的值未定义。在执行END操作的过程中,该值是处理的最后一个输入文件的名称。
FNR当前文件中的当前输入记录的个数。
FS输入字段分隔符。缺省值是空格。如果输入字段分隔符是空格,则任何数目的语言环境定义的空格可以分隔字段。FS特殊变量可以有两种附加的值:
  • 如果FS设置为单个字符,则字段由该字符的每个单个具体值隔开。
  • 如果FS设置为一个扩展正则表达式,则字段由与扩展正则表达式匹配的每个序列的具体值隔开。
NF当前记录中的字段个数,最大数 99 个。在BEGIN操作中,除非先前发出不带Variable参数的getline函数,否则NF特殊变量未定义。在END操作中,除非在输入END操作之前发出不带Variable参数的后续的、重定向的getline函数,否则NF特殊变量保留它为读取的最后一个记录而具有的值。
NR当前输入记录的个数。在BEGIN操作中,NR特殊变量的值是 0(零)。在END操作中,值是最后处理的记录的编号。
OFMT在输出语句中将数字转换为字符串的printf格式。缺省值为“%.6g”。
OFS输出字段分隔符(缺省值是空格)。
ORS输出记录分隔符(缺省值是换行字符)。
RLENGTHmatch函数来匹配的字符串的长度。
RS输入记录分隔符(缺省值是换行字符)。如果RS特殊变量为空,则记录以一个或多个空行的序列隔开;第一个空行或最后一个空行在输入的开始和结束都不会产生空记录;换行字符始终是一个字段分隔符,不考虑FS特殊变量的值。
RSTARTmatch函数来匹配的字符串的起始位置,从 1 开始编号。等同于match函数的返回值。
SUBSEP隔开多个下标。缺省值是 \031。

标志

+{ qSM`)w7AC0

Fd B'`T zq0
-fProgramFileProgramFile变量指定的文件获取awk命令的指令。如果多次指定-f标志,则文件的串联(按指定的顺序)将用作指令集。
-FEre请使用Ere变量指定的扩展正则表达式作为字段分隔符。缺省字段分隔符是空格。
-vAssignment将值指定给awk命令编程语言的变量。Assignment参数的格式是Name = ValueName部分指定变量的名称并可以是任何下划线、数字或字母字符的组合,但它必须以字母字符或下划线开头。Value部分也由下划线、数字和字母数字组成,且前面和后面都有一个 "(双引号字符,类似于字符串值)。如果Value部分是数字,则也将为变量指定数字值。

-v标志指定的赋值在执行awk命令程序的任何部分之前发生,包含BEGIN节。

8TYI6]? H`0
Assignment将值指定给awk命令编程语言的变量。该值和带有-v标志的Assignment变量具有相同的格式和功能(除了两者处理的时间不同以外)。Assignment参数在处于命令行时跟在其后的输入文件(由File变量指定)之前处理。如果指定Assignment参数仅优先于多个输入文件的第一个,则赋值在BEGIN节后(如果有)就处理。如果Assignment参数出现在最后一个文件后,则在END节(如果有)之前处理赋值。如果不指定输入文件,则当读取了标准输入时处理赋值。
File指定包含要处理的输入的文件的名称。如果不指定File变量,或指定了-(减号),则处理标准输入。
'Program'包含awk命令的指令。如果不指定-f标志,Program变量应该是命令行上的第一个项。它应括在 ' '(单引号)中。

退出状态

该命令返回以下出口值:51Testing软件测试网 A,z2W AEux

0成功完成。
>0发生错误。

可以通过使用exit[Expression]条件语句来更改程序中的退出状态。

&s_Y Qbr-F0

示例

  1. 要显示长于 72 个字符的文件的行,请输入:

    pT,dn+v$[9t9q0

    D:O5Q5f n~w;dn*b0
    awk  'length  >72'  chapter1

    这选择chapter1文件中长于 72 个字符的每一行,并将这些行写至标准输出,因为未指定Action。制表符以 1 个字符计数。

    /WczM VB8[V7w Uq.\0
  2. 要显示字startstop之间的所有行,包含“start”“stop”,请输入:

    $NZ k!\u| i @+J6v051Testing软件测试网!\~ T&@N&@iEoM

    awk  '/start/,/stop/'  chapter1
  3. 要运行一个处理文件chapter1awk命令程序sum2.awk,请输入:

    s#iFe%NL0

    'ju&g m^:v0
    awk  -f  sum2.awk  chapter1

    以下程序sum2.awk,计算了输入文件chapter1中的第二列的数字的总和与平均值:51Testing软件测试网u }L8ez%FK2w@c

    {
           sum += $2
        }
    END {
           print "Sum: ", sum;
           print "Average:", sum/NR;
        }

    第一个操作将每行的第二个字段的值添加至变量sum。当第一次被引用时,所有的变量都初始化为数字值 0(零)。第二个操作前的模式END使那些操作在读取了所有输入文件之后才执行。用于计算平均值的NR特殊变量是一个指定已经读取的记录的个数的特殊变量。

    Fg[JQn0
  4. 要以相反顺序打印前两个字段,请输入:

    $qR@Yl0

    R]2Y3}Y|0
    awk '{ print $2, $1 }' chapter1
  5. 以下awk程序
    awk -f sum3.awk chapter2
    打印文件chapter2的前两个字段(用逗号和/或空格和制表符隔开),然后合计第一列,并打印总和与平均值:
    BEGIN  {FS = ",|[ \t]+"}
           {print $1, $2}
           {s += $1}
    END    {print "sum is",s,"average is", s/NR }

TAG: Accesslog分析 awk 命令

水滴石穿的个人空间 引用 删除 水滴石穿   /   2010-03-02 18:10:25
赞 非常有帮助
 

评分:0

我来说两句

Open Toolbar