Accesslog分析常用命令 awk
上一篇 / 下一篇 2009-05-23 09:34:25 / 个人分类:liunx相关
awk 命令
51Testing软件测试网 t0js8\/Q\ E[`OD,e]j;I0用途
在文件中查找与模式匹配的行,然后在它们上面执行特定的操作。51Testing软件测试网O Hvde
语法
51Testing软件测试网9rs8i)Y` _Kawk[ -FEre] [ -vAssignment] ... { -fProgramFile|Program'} [ [ File ... | Assignment ... ] ] ...51Testing软件测试网P6eo^*fo m
描述
awk命令利用一组用户提供的指令来将一组文件和用户提供的扩展正则表达式比较,一次一行。然后在任何与扩展正则表达式匹配的行上执行操作。awk处理的最大记录大小为 10KB。51Testing软件测试网.U-_3[.D2]
awk命令的模式搜索比grep命令的搜索更常用,且它允许用户在输入文本行上执行多个操作。awk命令编程语言不需要编译,并允许用户使用变量、数字函数、字符串函数和逻辑运算符。
TT"LH0L%~0FI~ LZ0awk命令受到LANG、LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_NUMERIC、NLSPATH和PATH环境变量的影响。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变量。
- 修改特殊变量ARGV和ARGC。
- 在未提供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!j v+f0通过记录和字段的文件处理
文件以下列方式处理:51Testing软件测试网y1R*x!V!|/w{3vpE8U
- awk命令扫描它的指令,并执行任何指定为在读取输入文件前发生的操作。
awk编程语言中的BEGIN语句允许用户指定在读取第一个记录前要执行的一组指令。这对于初始化特殊变量特别有用。51Testing软件测试网'I)E9vc#w1H\4`
- 从输入文件读取一个记录。
记录是由记录分隔符隔开的一组数据。记录分隔符的缺省值是换行字符,它使文件中的每一行成为一个单独的记录。记录分隔符可以通过设置RS特殊变量来更改。
%c&^1GG3u)U0 - 记录是相对于awk命令的指令指定的每种模式比较。
命令指令可以指定应比较记录内的特定字段。缺省情况下,字段由空白区(空格或跳格)隔开。每个字段由一个字段变量表示。记录中的第一个字段指定为$1变量,第二个字段指定为$2变量,以此类推。整个记录指定为$0变量。字段分隔符可以通过在命令行使用-F标志或通过设置FS特殊变量来更改。FS特殊变量可以设置为下列值:空格、单个字符或扩展正则表达式。
3IH4e/?(J:q0 - 如果一个记录与一个模式相匹配,则任何与该模式相关的操作都在该记录上执行。
- 在记录和每个模式比较且执行了所有指定操作以后,从输入读取下一个记录;在从输入文件读取所有的记录之前,该进程重复。
- 如果已经指定了多个输入文件,则下一个文件打开,且在读取所有的输入文件之前,该进程重复。
- 在读取了最后一个文件中的最后一个记录后,awk命令执行任何指定为在输入处理后发生的指令。
awk编程语言中的END语句允许用户指定在读取最后一个记录后要执行的操作。这对于发送有关awk命令完成了什么工作的消息特别有用。
0GD-`2l;kw-S0@,kde5f0
awk 命令编程语言
awk命令编程语言由以下格式的语句构成:51Testing软件测试网]q0lj}h
Pattern{Action}51Testing软件测试网 wB*_;iDIU
如果一个记录与指定模式相匹配,或包含与该模式匹配的字段,则执行相关的操作。可以指定没有操作的模式,这种情况下,包含该模式的整行写至标准输出。为每个输入记录执行指定的没有模式的操作。51Testing软件测试网0i(l;s,K g9D k G{ WC
模式
在awk命令语言语法中使用四种类型的模式:
w!h6s8MrA0正则表达式
awk命令使用的扩展正则表达式类似于grep或egrep命令使用的表达式。扩展正则表达式的最简单的形式就是包括在斜杠中的一串字符。例如,假定一个名为testfile的文件具有以下内容:51Testing软件测试网)t!_#Wtm5AQ6H
7DU1fP&}H$eD051Testing软件测试网*s6aiI(J.c%P
smawley, andy smiley, allen smith, alan smithern, harry smithhern, anne smitters, alexis
输入以下一行命令:
:B)^ U_:Y6n Mq0%m"[ c+V)BN eL051Testing软件测试网QX~!Yp K,q/z
awk '/smi/' testfile
将把包含smi字符串的具体值的所有记录打印至标准输出。在这个示例中,awk命令的程序'/smi/'是一个没有操作的模式。输出是:51Testing软件测试网.tWn^0Z
51Testing软件测试网1yKC jz-C j4B51Testing软件测试网r {'~0G&}f
smiley, allen smith, alan smithern, harry smithhern, anne smitters, alexis
以下特殊字符用于形成扩展正则表达式:51Testing软件测试网i%|h+B5i pr4M
识别的转义序列
awk命令识别大多数用于 C 语言约定中的转义序列,以及awk命令本身用作特殊字符的几个转义序列。转义序列是:51Testing软件测试网1Zy y%vKi
转义序列 | 表示的字符 |
---|---|
\" | \"(双引号)标记 |
\/ | /(斜杠)字符 |
\ddd | 其编码由 1、2 或 3 位八进制整数表示的字符,其中d表示一个八进制数位 |
\\ | \ ( 反斜杠 ) 字符 |
\a | 警告字符 |
\b | 退格字符 |
\f | 换页字符 |
\n | 换行字符(请参阅以下的注) |
\r | 回车字符 |
\t | 跳格字符 |
\v | 垂直跳格 |
51Testing软件测试网W6RIc j3b
注:除了在gsub、match、split和sub内置函数中,扩展正则表达式的匹配都基于输入记录。记录分隔符字符(缺省情况下为换行字符)不能嵌套在表达式中,且没与记录分隔符字符匹配的表达式。如果记录分隔符不是换行字符,则可与换行字符匹配。在指定的四个内置函数中,匹配基于文本字符串,且任何字符(包含记录分隔符)可以嵌套在模式中,这样模式与适当的字符相匹配。然而,用awk命令进行的所有正则表达式匹配中,在模式使用一个或多个 NULL(空)字符将生成未定义的结果。
关系表达式
关系运算符 <(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)、= =(等于)和 !=(不等于)可用来形成模式。例如,模式:51Testing软件测试网h-F"]}Pbxu
x&O(F.Cj%f7l0
,bZ3kZl(N$n}0$1 < $4
将与第一个字段小于第四个字段的记录匹配。关系运算符还和字符串值一起使用。例如:
m8VH2n3{k3k0tnMq/b#] B&l051Testing软件测试网 BTYW6tsS ^ f
$1 =! "q"
将与第一个字段不是q的所有记录匹配。字符串值还可以根据校对值匹配。例如:
To-Np"On&d0lr3_051Testing软件测试网DkvI/v#{51Testing软件测试网1G6J p0H9HB,O8m
$1 >= "d"
将与第一个字段以字符a、b、c或d开头的所有记录匹配。如果未给出其它信息,则字段变量作为字符串值比较。
:prc$q'{0模式的组合
可以使用三种选项组合模式:51Testing软件测试网3s C i Q6p] PV sm
- 范围由两种以 ,(逗号)隔开的模式指定。操作在每个以匹配第一个模式的记录开始的每个记录上执行,并通过匹配第二个模式的记录(包含此记录)继续。例如:51Testing软件测试网da{W-L l n)e
51Testing软件测试网Ju5A9huR4l{
/begin/,/end/
与包含字符串begin的记录以及该记录和包含字符串end之间的所有记录(包含包括字符串end的记录)匹配。
3l4ReGQGAUim0 - 括号 ( ) 将模式组合在一起。
- 布尔运算符 ||(或)&&(和)以及 !(不)将模式组合成如果它们求值为真则匹配,否则不匹配的表达式。例如,模式:51Testing软件测试网L#@4D{?(q#rDHowD R0
$1 == "al" && $2 == "123"
与第一个字段是al且第二个字段是123的记录匹配。51Testing软件测试网UrSC.F}AF
BEGIN 和 END 模式
用BEGIN模式指定的操作在读取任何输入之前执行。用END模式指定的操作在读取了所有输入后执行。允许多个BEGIN和END模式,并以指定的顺序处理它们。在程序语句中END模式可以在BEGIN模式之前。如果程序仅由BEGIN语句构成,则执行操作且不读取输入。如果程序仅由END语句构成,则在任何操作执行前读取所有输入。
$] X$Hxs*{0操作
有多种类型的操作语句:51Testing软件测试网 Z-xA1N&Qk+O(f\
操作语句
操作语句括在 { } (花括号) 中。如果语句指定为没有模式,则它们在每个记录上执行。在括号里可以指定多个操作,但操作间必须以换行字符或 ;(分号)分隔,且语句以它们出现的顺序处理。操作语句包含:
_r9Vo*w!qD-l_0一元语句 |
一元-(减号)和一元+(加号)如在 C 编程语言中操作: T8X/c"I r Z'fz6che&LG051Testing软件测试网7w#a5LFV5OKu;d +Expression 或 -Expression |
字符串串联语句 |
字符串值可以通过紧挨着陈述来串联。例如: 5~P(^%J x}Vi/UP051Testing软件测试网 h T6A/yM nMV $3 = $1 $2 将字段变量$1和$2中的字符串的串联指定给字段变量$3。51Testing软件测试网zt?"?.b a"x |
内置函数
awk命令语言使用算术函数、字符串函数和一般函数。如果打算编写一个文件,且稍后在同一个程序里读取它,则 close 子例程语句是必需的。51Testing软件测试网*X&N%wvS
算术函数
以下算术函数执行与 C 语言中名称相同的子例程相同的操作:51Testing软件测试网(\c:O;[J,h
字符串函数
字符串函数是:
2Lz9Ku3V7^!~]q0gsub(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参数来关闭由print或printf语句打开的或调用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]<Expression | 从Expression参数指定的文件读取输入的下一个记录,并将Variable参数指定的变量设置为该记录的值。只要流保留打开且Expression参数对同一个字符串求值,则对getline函数的每次后续调用读取另一个记录。如果未指定Variable参数,则$0记录变量和NF特殊变量设置为从流读取的记录。 |
getline[Variable] | 将Variable参数指定的变量设置为从当前输入文件读取的下一个输入记录。如果未指定Variable参数,则$0记录变量设置为该记录的值,还将设置NF、NR和FNR特殊变量。 |
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`9u0function Name (Parameter, Parameter,...) { Statements }
函数可以指向awk命令程序中的任何位置,且它的使用可以优先于它的定义。此函数的作用域是全局的。
k @zNG0函数参数可以是标量或数组。参数名称对函数而言是本地的;所有其它变量名称都是全局的。同一个名称不应用作不同的实体;例如,一个参数名称不能用作函数名称又用作特殊变量。具有全局作用域的变量不应共享一个函数的名称。同个作用域中的标量和数组不应具有同一个名称。51Testing软件测试网o%R-S{6V,[
函数定义中的参数数量不必和调用函数时使用的参数数量匹配。多余的形式参数可用作本地变量。额外的标量参数初始化后具有等同于空字符串和数字值为 0(零)的字符串值;额外的数组参数初始化为空数组。
{#[+Q4Jh0当调用函数时,函数名称和左括号之间没有空格。函数调用可以是嵌套的或循环的。从任何嵌套的或循环函数函数调用返回时,所有调用函数的参数的值应保持不变,除了引用传送的数组参数。return语句可用于返回一个值。
8Z1oY6Pr d0在函数定义内,在左 { ( 花括号 ) 之前和右 } ( 花括号 ) 之后的换行字符是可选的。