51Testing软件测试网.cLL4p#y&K{
8S];F'G||F0用途
在文件中查找与模式匹配的行,然后在它们上面执行特定的操作。
vw6Pi8x0语法
51Testing软件测试网_q3zx:v%T)yN{0y%gawk[ -FEre] [ -vAssignment] ... { -fProgramFile|Program'} [ [ File ... | Assignment ... ] ] ...
)n!{T~IWL{%~@0描述
awk命令利用一组用户提供的指令来将一组文件和用户提供的扩展正则表达式比较,一次一行。然后在任何与扩展正则表达式匹配的行上执行操作。awk处理的最大记录大小为 10KB。
l(F-fdC+oF8d-f:O0awk命令的模式搜索比grep命令的搜索更常用,且它允许用户在输入文本行上执行多个操作。awk命令编程语言不需要编译,并允许用户使用变量、数字函数、字符串函数和逻辑运算符。51Testing软件测试网3i\(w{!jC
awk命令受到LANG、LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_NUMERIC、NLSPATH和PATH环境变量的影响。51Testing软件测试网6E4^yN2f&k[u
本章中包括以下主题:51Testing软件测试网m8E8Y z g-V
awk 命令的输入
awk命令采取两种类型的输入:输入文本文件和程序指令。
rM~4{1u7F-t0输入文本文件
搜索和操作在输入文本文件上执行。文件如下指定:
}Xg7og"I+M0- 在命令行指定File变量。
- 修改特殊变量ARGV和ARGC。
- 在未提供File变量的情况下提供标准输入。
如果用File变量指定多个文件,则文件以指定的顺序处理。51Testing软件测试网/Vs0_Evh
程序指令
用户提供的指令控制awk命令的操作。这些指令来自命令行的‘Program’变量或来自用-f标志和ProgramFile变量一起指定的文件。如果指定多个程序文件,这些文件以指定的顺序串联,且使用指令的生成的顺序。
uu:w+n,S*Nlj0awk 命令的输出
awk命令从输入文本文件中的数据产生三种类型的输出:
)jG"c/koO?\0- 选定的数据可以打印至标准输出,此输出完全同于输入文件。
- 输入文件的选定部分可以更改。
- 选定数据可以更改并可打印至标准输出,此输出可以同于或不同于输入文件的内容。
可以在同一个文件上执行所有三种类型的输出。awk命令识别的编程语言允许用户重定向输出。
X,vD*Q$qYU0通过记录和字段的文件处理
文件以下列方式处理:51Testing软件测试网.q+kz%~6cV|
- awk命令扫描它的指令,并执行任何指定为在读取输入文件前发生的操作。
awk编程语言中的BEGIN语句允许用户指定在读取第一个记录前要执行的一组指令。这对于初始化特殊变量特别有用。51Testing软件测试网E8q$e
B4Dp
- 从输入文件读取一个记录。
记录是由记录分隔符隔开的一组数据。记录分隔符的缺省值是换行字符,它使文件中的每一行成为一个单独的记录。记录分隔符可以通过设置RS特殊变量来更改。51Testing软件测试网)J$B`rl,Z"F
- 记录是相对于awk命令的指令指定的每种模式比较。
命令指令可以指定应比较记录内的特定字段。缺省情况下,字段由空白区(空格或跳格)隔开。每个字段由一个字段变量表示。记录中的第一个字段指定为$1变量,第二个字段指定为$2变量,以此类推。整个记录指定为$0变量。字段分隔符可以通过在命令行使用-F标志或通过设置FS特殊变量来更改。FS特殊变量可以设置为下列值:空格、单个字符或扩展正则表达式。51Testing软件测试网8C'f'{K~
- 如果一个记录与一个模式相匹配,则任何与该模式相关的操作都在该记录上执行。
- 在记录和每个模式比较且执行了所有指定操作以后,从输入读取下一个记录;在从输入文件读取所有的记录之前,该进程重复。
- 如果已经指定了多个输入文件,则下一个文件打开,且在读取所有的输入文件之前,该进程重复。
- 在读取了最后一个文件中的最后一个记录后,awk命令执行任何指定为在输入处理后发生的指令。
awk编程语言中的END语句允许用户指定在读取最后一个记录后要执行的操作。这对于发送有关awk命令完成了什么工作的消息特别有用。
3C#iEv1ok(A1O'}0
awk 命令编程语言
awk命令编程语言由以下格式的语句构成:51Testing软件测试网0sl~x-H"s^g
Pattern{Action}
D.m H\V!Y)f;U0如果一个记录与指定模式相匹配,或包含与该模式匹配的字段,则执行相关的操作。可以指定没有操作的模式,这种情况下,包含该模式的整行写至标准输出。为每个输入记录执行指定的没有模式的操作。51Testing软件测试网,{~b`2{s
Q
模式
在awk命令语言语法中使用四种类型的模式:
)tyo6z4W o%Z6P0V [0正则表达式
awk命令使用的扩展正则表达式类似于grep或egrep命令使用的表达式。扩展正则表达式的最简单的形式就是包括在斜杠中的一串字符。例如,假定一个名为testfile的文件具有以下内容:
%axl(]S051Testing软件测试网7F'mc)SHV0^0n:|-f!|;t3ek%B(WL`0smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
输入以下一行命令:
\%W$HQ0}2tOy051Testing软件测试网4NR'E{ x51Testing软件测试网QR1~(d!C
awk '/smi/' testfile
将把包含smi字符串的具体值的所有记录打印至标准输出。在这个示例中,awk命令的程序'/smi/'是一个没有操作的模式。输出是:
8k s:C,S#N1p%r#\051Testing软件测试网H_\.p:^P5Wb(D9rY*E!`0smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
以下特殊字符用于形成扩展正则表达式:
gD:@um#|5e^n5b0字符 | 功能 |
---|
+ | 指定如果一个或多个字符或扩展正则表达式的具体值(在+(加号)前)在这个字符串中,则字符串匹配。命令行: 0DRp'nF'@0 N yZ
Fn8A0awk '/smith+ern/' testfile 将包含字符smit,后跟一个或多个h字符,并以字符ern结束的字符串的任何记录打印至标准输出。此示例中的输出是:51Testing软件测试网H:r+}M"c 51Testing软件测试网U.YH`A?+UTk p}2?0smithern, harry
smithhern, anne |
? | 指定如果零个或一个字符或扩展正则表达式的具体值(在 ?(问号)之前)在字符串中,则字符串匹配。命令行: 1@-j([G-UO6e&p0 o@F)Z:}D6i0awk '/smith?/' testfile 将包含字符smit,后跟零个或一个h字符的实例的所有记录打印至标准输出。此示例中的输出是: 3E0|}~D4Q0$HkSEL&eX Ew0 1n)q
T0l"Hq.OV7^m0smith, alan
smithern, harry
smithhern, anne
smitters, alexis |
| | 指定如果以 |(垂直线)隔开的字符串的任何一个在字符串中,则字符串匹配。命令行:51Testing软件测试网3rbHW-J-tNR8B? o
}h0awk '/allen
|
alan /' testfile 将包含字符串allen或alan的所有记录打印至标准输出。此示例中的输出是: t/x!C1N'Jm[:[0
ZyA?"_y(~`
t Y051Testing软件测试网)`4E{)wI&e:} U5M smiley, allen
smith, alan |
( ) | 在正则表达式中将字符串组合在一起。命令行: se-l[nVN
v7kZ7jo051Testing软件测试网"o0[+@(eU awk '/a(ll)?(nn)?e/' testfile 将具有字符串ae或alle或anne或allnne的所有记录打印至标准输出。此示例中的输出是:51Testing软件测试网2rk"w.{O [}6CAP.sK@R*}0 #gW.P3v'i$p0N.g0smiley, allen
smithhern, anne |
{m} | 指定如果正好有m个模式的具体值位于字符串中,则字符串匹配。命令行:51Testing软件测试网 ] h5id%L0AA< 51Testing软件测试网-Y
I V%n"YQP3lT9y2l awk '/l{2}/' testfile 打印至标准输出51Testing软件测试网R~#Kx'c#| 6trK8COx!N1qq0 \)X
xqQ/Ys"|U0E@ R0smiley, allen |
{m,} | 指定如果至少m个模式的具体值在字符串中,则字符串匹配。命令行:51Testing软件测试网9@ ~!dssEqE"`{ 51Testing软件测试网0~"qV5~6jEq:qLH awk '/t{2,}/' testfile 打印至标准输出:51Testing软件测试网2S)b],\dZ9a1I7FO` Hz`\!i0p\Q@9A051Testing软件测试网
zv|'E}4Y'A2H^d smitters, alexis |
{m, n} | 指定如果m和n之间(包含的 m 和 n)个模式的具体值在字符串中(其中m<=n),则字符串匹配。命令行:51Testing软件测试网fn7E'[MRsu:X_vh6v 51Testing软件测试网[A$xf,N&wR awk '/er{1, 2}/' testfile 打印至标准输出:51Testing软件测试网'r3Ll$T8F U$i9Q*p
e"ql#[`0 ];Q Ab8Y]6_E?0{0smithern, harry
smithern, anne
smitters, alexis |
[String] | 指定正则表达式与方括号内String变量指定的任何字符匹配。命令行: $r Pxs,N@e051Testing软件测试网?2~U Yo[n#[ awk '/sm[a-h]/' testfile 将具有sm后跟以字母顺序从a到h排列的任何字符的所有记录打印至标准输出。此示例的输出是: -R2ME8p@AW"F051Testing软件测试网V_e&RG/D51Testing软件测试网nf \/?1^+o*B+[ q smawley, andy |
[^String] | 在 [ ](方括号)和在指定字符串开头的 ^ (插入记号) 指明正则表达式与方括号内的任何字符不匹配。这样,命令行: F)},Z?FNA+}0 !c7M1}IJe"s$N,}0awk '/sm[^a-h]/' testfile 打印至标准输出: #?6rw~rmQ S
x3Y051Testing软件测试网%mWR'z-_ z&OM
s-@51Testing软件测试网 s?P N C4ZLa@ smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis |
~,!~ | 表示指定变量与正则表达式匹配(代字号)或不匹配(代字号、感叹号)的条件语句。命令行:51Testing软件测试网eIB2w&R&]?.B9?$K
WDhS-a/q7S;LS/t6h0awk '$1 ~ /n/' testfile 将第一个字段包含字符n的所有记录打印至标准输出。此示例中的输出是: .wF"|6}
cb!|D[U |051Testing软件测试网"hx/L]DsQ+Y]a3j"FZ0smithern, harry
smithhern, anne |
^ | 指定字段或记录的开头。命令行:51Testing软件测试网|;nzH
C)JC'tW;x 51Testing软件测试网)[ I9r
s+q~pa(^ awk '$2 ~ /^h/' testfile 将把字符h作为第二个字段的第一个字符的所有记录打印至标准输出。此示例中的输出是: (KRx J]~0[*?f1A'Jao\V_051Testing软件测试网'J;s,ig1];\f8_r.B smithern, harry |
$ | 指定字段或记录的末尾。命令行: WPS|$}N/T0 O?d!N|u0awk '$2 ~ /y$/' testfile 将把字符y作为第二个字段的最后一个字符的所有记录打印至标准输出。此示例中的输出是:
K.Ss
n3MGDw&VP
i051Testing软件测试网1c/o%D Zp.]o+F_.nHhQ&?~0smawley, andy
smithern, harry |
.(句号) | 表示除了在空白末尾的终端换行字符以外的任何一个字符。命令行: ;e4aE Pr@UX051Testing软件测试网 E&ui(z.x9j9o%F awk '/a..e/' testfile 将具有以两个字符隔开的字符a和 e 的所有记录打印至标准输出。此示例中的输出是:51Testing软件测试网/{!^)l!bnK+W yR
B 51Testing软件测试网L?
sO#b [&Dp |