在类似Unix的操作系统上,awk命令运行AWK(一种文本处理编程语言)。 本文档涵盖AWK的GNU / Linux版本gawk。 在Linux系统上,awk命令通常是指向可执行文件/ usr / bin / gawk的符号链接。
查看英文版
1 awk 运行系统环境
2 awk 说明
3 awk 语法
4 awk 例子
Linux
AWK是“ Aho,Weinberger和Kernighan”的缩写,是一种着重于处理文本的解释型 编程语言。
AWK 由Alfred Aho,Peter Weinberger和Brian Kernighan在贝尔实验室于1970年代开发。它旨在对文本数据流执行复杂的模式匹配操作。它大量使用了字符串,关联数组和正则表达式,对解析系统数据和生成自动报告非常有用。
AWK是Perl的直接前身,在现代系统中仍然非常有用。在GNU自由软件项目分发的开放源代码版本的awk称作gawk的。
查看英文版
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
-F fs |
将输入字段分隔符设置到正则表达式fs 。 |
-v var=value |
在执行 awk程序之前,将值值分配给变量 var。 |
'prog' |
awk程序。 |
-f progfile |
指定一个文件,progfile,其中包含要执行的 awk程序。 |
file ... |
要由指定的awk程序处理的文件。 |
Awk 扫描每个输入文件,以寻找与在 prog 或指定为-f progfile的一个或多个文件中指定的一组模式中的任何一组匹配的行。对于每个模式,当文件的一行与模式匹配时,可以执行一个关联的操作。每行与每个模式操作语句的模式部分匹配;对每个匹配的模式执行关联的操作。文件名"-"(破折号)指示 awk 从标准输入读取。选项-v后跟var=值是执行 prog 之前要完成的分配;可能存在任何数量的 -v选项。-F fs选项将输入字段分隔符定义为正则表达式 fs。
输入行通常由用空格分隔的字段或正则表达式fs 分隔。字段表示$1, $2,...,而$0表示整行。如果fs为 null,则输入行将拆分为每个字符的一个字段。
模式操作语句具有窗体
pattern { action }
缺少[ 操作 ]表示打印行;如果未指定模式,则始终匹配。模式操作语句用用更行或分号分隔。
操作是一系列语句。语句可以是以下语句之一:
If( expression ) statement [ else statement ]
while( expression ) statement
for( expression ; expression ; expression ) statement
for( var in array ) statement
do statement while( expression )
break
continue
{ [ statement ... ] }
expression
print [ expression-list ] [ > expression ]
printf format [ , expression-list ] [ > expression ]
return [ expression ]
next
(跳过此输入行上的剩余模式)
nextfile
(跳过此文件的其余部分,打开下一个,从顶部开始)
delete array[ expression ]
(删除数组元素)
delete array
(删除数组的所有元素)
exit [ expression ]
(立即退出;退出状态是表达式的评估)
语句由分号、新行或右大括号终止。空表达式列表代表$0。字符串常量被引用为"",通常的C转义在内被识别。表达式以字符串或数值为适用,并使用运算符 \ , - *, /, % , + (表示) 和串联(以空格表示)构建。
运算符! 、= 、--、 -- = 、/= 、%= 、== 、>、>、<、<=、\,\, 和?, 在表达式中也可用。 变量可以是标量、数组元素(表示x[i])或字段。变量初始化为空字符串。数组下标可能是任何字符串,不一定是数字;这允许一种形式的关联内存。允许使用多个下标,如 [i,j,k];成分是串联的,由SUBSEP 的值分隔。
打印语句将其参数打印在标准输出上(如果存在 >file 或 >>文件,则打印在文件上,如果存在 \cmd,则打印在管道上),由当前输出字段分隔符分隔,并由输出记录分隔符终止。文件和 cmd可以是文本名称或括号化表达式;不同语句中的相同字符串值表示相同的打开文件。printf语句根据格式设置其表达式列表的格式(请参阅printf)。内置函数关闭(expr)关闭文件或管道expr。内置函数fflush(expr)刷新文件或管道expr的任何缓冲输出。
数学函数exp, log, sqrt, sin, cos, atan2内置.其他内置功能:
length |
其参数的长度作为字符串,如果没有参数,则为 $0。 |
rand |
0 和 1 之间的随机数 |
srand |
为rand设置种子并返回上一个种子。 |
int |
截断为整数值 |
substr(s, m, n) |
从1开始的位置 m的 s的 n 字符子字符串。 |
index(s, t) |
出现字符串t的位置,如果没有,则为 0。 |
match(s, r) |
正则表达式 r发生的位置,如果没有正则表达式r的位置,则为 0。变量RSTART 和 RLENGTH设置为匹配字符串的位置和长度。 |
split(s, a, fs) |
将字符串 s 拆分为数组元素a{1}、a{2}、...、a=n=,并返回n。如果未给出 fs,则使用正则表达式fs或字段分隔符FS进行分离。 作为字段分隔符的空字符串将字符串拆分为每个字符的一个数组元素。 |
sub(r, t, s) |
替换t替换字符串 s 中正则表达式r的第一次出现。如果未给出 s,则使用 $0。 |
gsub |
与子相同,但替换正则表达式的所有匹配项;子和 gsub返回替换件数。 |
sprintf(fmt, expr, ... ) |
根据打印格式 fmt格式化expr生成的字符串 |
system(cmd) |
执行cmd并返回其退出状态 |
tolower(str) |
返回一个str 副本,其中所有大写字符都转换为相应的小写等效字符。 |
toupper(str) |
返回一个str 副本,其中所有小写字符都转换为相应的大写等效项。 |
函数getline 将 $0设置到当前输入文件中的下一个输入记录;getline <文件将 $0 设置到文件中的下一个记录。getline x设置变量 x代替。最后,cmd = getline管道的输出 cmd到getline;getline 的每个调用返回 cmd 的下一行输出。在所有情况下,getline 返回 1表示成功的输入,0表示文件末尾,而 -1表示错误。
模式是正则表达式和关系表达式的任意布尔组合(带 !正则表达式在 re_format 中定义。模式中的独立正则表达式应用于整行。使用运算符 [和 ] 时,关系表达式中也可能出现正则表达式。/re/ 是一个常量正则表达式;任何字符串(常量或变量)可用作正则表达式,除非在模式中隔离正则表达式的位置。
图案可以由两个用逗号分隔的图案组成;在这种情况下,对来自第一个模式出现的所有行执行操作,而第二个模式的发生。
关系表达式是以下表达式之一:
expression matchop regular-expression
expression relop expression
expression in array-name
(expr,expr,...) in array-name
其中重新翻牌是C 中的六个关系运算符中的任何一个,并且匹配项是+(匹配)或 != (不匹配)。条件是算术表达式、关系表达式或这些表达式的布尔组合。
特殊模式BEGIN和END可用于在读取第一个输入行之前和最后一个输入行之后捕获控件。BEGIN 和 END 不与其他模式结合。
具有特殊含义的变量名称:
CONVFMT |
转换数字时使用的转换格式(默认值: %.6g)。 |
FS |
用于分隔字段的正则表达式;也可以按选项-Ffs 设置。 |
NF |
当前记录中的字段数。 |
NR |
当前记录的序号。 |
FNR |
当前文件中当前记录的序号。 |
FILENAME |
当前输入文件的名称。 |
RS |
输入记录分隔符(默认值:新行)。 |
OFS |
输出字段分隔符(默认值:空白)。 |
ORS |
输出记录分隔符(默认值:新行)。 |
OFMT |
数字的输出格式(默认值: %.6g)。 |
SUBSEP |
字符分隔多个下标(默认值:034,这是双引号的 ASCII 代码)。 |
ARGC |
参数计数,可分配。 |
ARGV |
参数数组,可分配;非空成员被视为文件名。 |
ENVIRON |
环境变量数组;下标是名称。 |
函数可以定义(在模式操作语句的位置),像这样:
function foo(a, b, c) { ...; return x }
参数通过值(如果标量)或引用(如果数组名称)传递;函数可以递归调用。参数是函数的本地参数;所有其他变量都是全局变量。因此,可以通过在函数定义中提供多余的参数来创建局部变量。
查看英文版
awk 'length($0) > 72' text.txt
仅打印超过72个字符的文件文本.txt行。
awk '{ print $2, $1 }' data.txt
按相反的顺序打印前两个数据字段。例如,如果文件数据.txt包含以下行:
red apple blue berry green thumb
...然后上述awk 命令的输出将是:
apple red berry blue thumb green
大多数 awk 程序太长,不能在命令行上指定。如果程序保存在文件prog.awk 中,则为以下命令。
awk -f prog.awk file.txt
上述命令在prog.awk中执行 awk 程序来处理文件文件.txt 的内容。
其余示例只是 awk 程序本身。
{ s += $1 } END { print "sum is", s, " average is", s/NR }
此程序将添加其输入文件的第一列,并打印值的总和和平均值。
/start/, /stop/
此程序将打印在 [开始] 和 [停止] 之间找到的所有文本行。
BEGIN { for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i] printf "\n" exit }
此 awk 程序模拟回声命令。
查看英文版
apt-cache | apt-get | ar | arch | arp | as | a2p | aspell | ac | at | adduser | a2p | apropos | alias | agrep | addgroup |
未知的网友