本文目录:
1.awk简介和基本语法格式
2.print和printf格式化输出
3.输入行的字段分隔符和行分隔符
4.BGEIN和END
5.数组
6.流程控制语句
6.1 条件判断语句
6.2 while循环
6.3 do循环
6.4 for循环
7.更完整的awk程序格式和表达式
8.awk中的变量
9.awk中的内置函数
10.自定义函数
11.getline函数
12.向awk传递变量
1. awk简介和基本语法格式
Awk自动地搜索输入文件,并把每一个输入行切分成字段。许多工作都是自动完成的,例如读取每个输入行、字段分割、存储管理、初始化等。在AWK中不需声明变量数据类型,它内置字符串类型和数值类型。
一般来说,在CentOS上安装的awk默认是gawk。它的调用格式为:
awk [OPTIONS] -f program_file [--] filename_list
awk [OPTIONS] [--] program filename_list
program是awk程序的重中之重,称为awk的程序,它的格式为PATTERN{ACTIONS}
。awk每读入一行,都会先与PATTERN做匹配比较,当找到符合条件的数据就执行对应的ACTION。
其中PATTERN或ACTIONS二者可省一。省略PATTERN时表示对所有行都执行ACTIONS,省略ACTIONS表示对符合条件的行执行默认的print动作。因为二者可省一,所以用大括号{}将ACTIONS部分包围起来,以区分PATTERN和ACTIONS。
一个简单的例子,输出/etc/passwd中用户shell为/bin/bash的用户名,其中使用"-F"选项指定冒号作为分隔符。
awk -F':' '$7 == "/bin/bash"{print "who use bash shell: ",$1}' /etc/passwd
其中位置变量$1,$2...为该行的第几个字段,"$0"表示整行。
如果要输出多个字段,则字段之间使用逗号","分隔,例如{print $1,$5}
。但输出时,仍默认以空格分隔各输出字段。
如果action为print $1 $5
,则结果会将"$1"和"$5"拼接在一起,因为空格是awk中的拼接字符。例如变量赋值name = "abc" "bcd"
等价于name="abcbcd"
。其实不算是拼接符,而是因为awk会忽略任何不被引号包围的空白。
2.print和printf格式化输出
awk使用print和printf输出数据,不仅可以输出到标准输出中,还可以重定向到文件中,使用管道传递给另一个命令。
- print
将 $0 打印到标准输出。等价于print $0
。
- print expression, expression, …
打印各个 expression, expression 之间由 OFS 分开, 由 ORS 终止
- print expression,expression,… > filename
文件名filename必须使用双引号包围,否则被当作变量。且文件只会被打开一次。
- print expression,expression,… >> filename
- print expression,expression,… | command
将数据传递给系统命令。命令需要使用双引号包围。
- printf(format,expression,expression,…)
- printf(format,expression,expression,…) > filename
- printf(format,expression,expression,…) >> filename
- printf(format,expression,expression,…) | command
- close(filename), close( command)
断开 print 与 filename (或 command) 之间的连接
- system(command)
执行 command; 函数的返回值是 command 的退出状态
如果print或printf的参数列表中含有操作符,则需要使用括号包围,否则容易产生歧义。如:
print($1, $3) > ($3 > 100 ? "bigpop" : "smallpop")
print $1, ($2 > $3)
执行系统命令的方式,可以通过管道的方式,也可以通过system()函数。注意包围命令的引号加的位置。
awk 'BEGIN{name="ma long shuai";print (1,2,3,4) | "echo " name}'
awk 'BEGIN{while (("fdisk -l" | getline) >0){print $0}}' awk 'BEGIN{system("fdisk -l")}' awk 'BEGIN{name="ma long shuai";system("echo " name)}'
printf命令可以输出更格式化的数据。
printf(format, value1, value2, ... , valueN)
format是一个字符串,包含按字面输出的纯文本,还包含输出格式,格式使用格式说明符"%"描述,后面跟着几个字符,这些字符控制一个value的输出格式。第一个"%"描述value1的输出格式,第二个"%"描述value2的输出格式,依次类推。因此,"%"的数量应该和被输出的value数量一样多。
例如:
{ printf("total pay for %s is $%.2f\n", $1, $2 * $3) }
{ printf("%-8s $%6.2f\n", $1, $2 * $3) }
第一个程序包含了两个要格式化的value,分别是"$1"和"$2 * $3"。这两个value的输出格式分别被"%s"和"%.2f"描述,前者表示按字符串格式输出"$1",后者表示按小数值格式输出"$2 * $3",且小数位占2位。由于printf不自带尾随换行符,因此手动加一个换行符"\n"。
第二个程序,"%-8s"表示"$1"按字符串格式输出,但短横线"-"表示要左对齐输出,"8"表示占用8个字符宽度,不足之数在右边空格补齐。"%6.2f"表示按小数格式输出"$2 * $3",且小数位占用2位,总字符数占用6位。注意,小数点也占用一个字符宽度。因此,一个可能的输出值为"123.20"。
格式说明符&qu