第一个 awk
打印文本
shell> awk '{ print }' /etc/passwd
打印空白行
只要将 "" 字符串传递给 print 命令,它就会打印空白行。 如果测试该脚本,将会发现对于/etc/passwd 文件中的每一行,awk 都输出一个空白行。 再次说明, awk 对输入文件中的每一行都执行这个脚本。
# 对每一行都执行输出 "" (空白)shell> awk '{ print ""}' /etc/passwd### 对每一行都执行haiyishell> awk '{ print "haiyi"}'
多个字段
指定分隔符
在调用 awk 时,使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理 print $1
命令时,它会打印出在输入文件中每一行中出现的第一个字段
shell> awk -F":" '{ print $1 }' /etc/passwdshell> awk -F":" '{ print $1 $3 }' /etc/passwd
当两个字符串在 awk 程序中彼此相邻时,awk 会连接它们但不 在它们之间添加空格
shell> awk -F":" '{ print $1 " " $3 }' /etc/passwdroot 0bin 1daemon 2adm 3
输出标签
shell> awk -F":" '{ print "username: " $1 "\t\tuid:" $3 }' /etc/passwdusername: root uid:0username: bin uid:1username: daemon uid:2username: adm uid:3
BEGIN和END模块
BEGIN模块
通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中, 可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许您定义一个 BEGIN 块。我们在前一个示例中使用了 BEGIN 块。因为 awk 在开 始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打 印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
END模块
awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后 执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信 息。规则表达式和块 awk 允许使用规则表达式,根据规则表达式是否匹配当前行来选 择执行独立代码块。以下示例脚本只输出包含字符序列 foo 的那些行
例子
只输出包含字符序列 root 的那些行
shell> awk '/root/{ print }' /etc/passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin
可以使用更复杂的规则表达式。以下脚本将只打印包含浮点数的行:
shell> awk '/[0-9]+\.[0-9]*/ { print }' /etc/init.d/functionsdelay=$(echo $2 | awk -v RS=' ' -v IGNORECASE=1 '{if($1!~/^[0-9.]+[smhd]?$/) exit 1;d=$1~/s$|^[0-9.]*$/?1:$1~/m$/?60:$1~/h$/?60*60:$1~/d$/?24*60*60:-1;if(d==-1) exit 1;delay+=d*$1} END {printf("%d",delay+0.5)}')
我们可以将任意一种布尔表达式放在一个代码块之前,以控制何时执行某特定块。仅当对前面的布尔表达式求值为真时, awk 才执行代码块。以下示例脚本输出将输出其第一个字段等于 root 的所有行中的第 三个字段。如果当前行的第一个字段不等于 root,awk 将继续处理文件而不对当前行执 行 print 语句:
shell> awk -F ":" ' $1 == "root" { print $3 }' /etc/passwd0
awk 提供了完整的比较运算符集合,包括 "=="、"<"、">"、"<="、">=" 和 "!="。另外,
awk 还提供了 "~" 和 "!~" 运算符,它们分别表示“匹配”和“不匹配”。它们的用法是在运算符左边指定 变量,在右边指定规则表达式。如果某一行的第五个字段包含字符序列 root,那么以下 示例将只打印这一行中的第三个字段shell> awk -F ":" ' $1 ~ /root/ { print $3 }' /etc/passwd0
条件语句
{ if ( $1 == "foo" ) {if ( $2 == "foo" ) { print "uno" } else {print "one" }}else if ($1 == "bar") {print "two"} else {print "three" }}
awk 获取shell变量
var="this is a test" awk -v nvar="$var" '{print nvar}'