1 | awk ' BEGIN{ print "start" } pattern { commands } END{ print "end" } file |
---|
awk 脚本通常由3部分组成。 BEGIN , END 和带模式匹配选项的常见语句块。这3个部分都是可 选项,在脚本中可省略任意部分。
AWK 脚本包含在单引号之间
1 | awk 'BEGIN { statements } { statements } END { end statements }' |
---|
文件的内容格式如下,在命令使用awk -f <programfile> <inputfile>
programfile
: AWK 脚本文件inputfile
: 被处理的文件1BEGIN { statements } { statements } END { end statements } Read AWK从输入流(文件,管道或者标准输入)中读取一行,然后存储到内存中。
Execute 所有的AWK命令都依次在输入上执行。默认情况下,AWK会对每一行执行命令,我们可以通过提供模式限制这种行为。
Repeat 处理过程不断重复,直到到达文件结尾。
变量名 | 含义 |
---|---|
NR | 表示记录数量,在执行过程中对应于当前行号。 |
NF | 表示字段数量,在执行过程中对应于当前行的字段数。 |
$0 | 这个变量包含执行过程中当前行的文本内容。 |
$1 | 这个变量包含第一个字段的文本内容。 |
$2 | 这个变量包含第二个字段的文本内容。 |
范例 | 效果 |
---|---|
$ awk '{ print $3,$2 }' file | 打印每一行的第2和第3个字段 |
$ awk 'END{ print NR }' file | 统计文件中的行数 |
借助选项 -v
,我们可以将外部值(并非来自 stdin )传递给 awk
123 | $ VAR=10000$ echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'10000 |
---|
awk 通常默认读取一个文件的所有行。如果只想读取某一行,可以使用 getline 函数。有时候,我们需要从 BEGIN 语句块中读取第一行。
语法: getline var
变量 var 就包含了特定行的内容。如果调用不带参数的 getline ,我们可以用 $0
、 $1
和 $2
访问文本行的内容。
123456 | $ seq 5 | awk 'BEGIN { getline; print "Read ahead first line", $0 } { print $0 }'Read ahead first line 12345 |
---|
范例 | 效果 |
---|---|
awk 'NR < 5' | 行号小于5 的行 |
awk 'NR==1,NR==4' | 行号在1到5之间的行 |
awk '/linux/' | 包含样式linux 的行(可以用正则表达式来指定模式) |
awk '!/linux/' | 不包含包含模式为linux |
默认的字段定界符是空格。我们也可以用 -F “delimiter” 明确指定一个定界符
$ awk -F: '{ print $NF }' /etc/passwd
在 BEGIN 语句块中则可以用 OFS="delimiter"
设置输出字段的定界符。
将命令的输出结果读入变量 output 的语法如下
"command" | getline output ;
12 | $ echo | awk '{ "grep root /etc/passwd" | getline cmdout ; print cmdout }'root:x:0:0:root:/root:/bin/bash |
---|
通过使用 getline ,我们将外部shell命令的输出读入变量 cmdout 。
for(i=0; i<10; i++) { print $i ; }
或者
for(i in array) { print array[i]; }
范例 | 效果 |
---|---|
length(string) | 返回字符串的长度。 |
index(string, search_string) | 返回 search_string 在 string 中出现的位置。 |
split(string, array, delimiter) | 用定界符生成一个字符串列表,并将该列表存 入数组。 |
substr(string, start-position, end-position) | 在字符串中用字符起止偏移 量生成子串,并返回该子串。 |
sub(regex, replacement_str, string) | 将正则表达式匹配到的第一处内容替换成 replacment_str 。 |
gsub(regex, replacment_str, string) | 和 sub() 类似。不过该函数会替换正则表达式匹配到的所有内容。 |
match(regex, string) | 检查正则表达式是否能够匹配字符串。如果能够匹配,返回 非0值;否则,返回0。 |