awk '{ print }' /etc/passwd执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout。在shell下执行会把文件内容全部打印出来,等价于命令"cat /etc/passwd"。
awk '{ print "hello" }' /etc/passwd此时会打印文件行数个hello。
awk -F":" '{ print $1 $3 }' /etc/passwd上面命令打印第1,3个字段,但是是连接在一起的,我们可以加入一些分割字符,打印出可读字符串。如下:
awk -F":" '{ print "name: " $1"\t\tuid:" $3}' /etc/passwd
BEGIN { FS=":" } { print $1 }
通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许您定义一个 BEGIN 块。我们在前一个示例中使用了 BEGIN 块。因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
awk 允许使用规则表达式,根据规则表达式是否匹配当前行来选择执行独立代码块。
awk 提供了完整的比较运算符集合,包括 "=="、"<"、">"、"<="、">=" 和 "!="。另外,awk 还提供了 "~" 和 "!~" 运算符,它们分别表示“匹配”和“不匹配”。它们的用法是在运算符左边指定变量,在右边指定规则表达式。以下示例脚本只输出包含字符序列 root 的那些行:
awk '/root/{ print $1}' /etc/passwd
awk 还提供了非常好的类似于 C 语言的 if 语句。如果您愿意,可以使用 if 语句重写前一个脚本:
{ if( $5 ~ /root/ ) { print$3 } }
awk 还允许使用布尔运算符 "||"(逻辑与)和 "&&"(逻辑或),以便创建更复杂的布尔表达式:
( $1 == "root" ) && ( $2 == "x" ) {print }/etc/passwd
awk ' BEGIN { x=0 } { x=x+1 } END { print "There is " x " lines in the file" } ' /etc/passwdawk 有完整的数学运算符集合。除了标准的加、减、乘、除,awk还允许使用指数运算符 "^"、模(余数)运算符 "%" 和其它许多从 C 语言中借入的易于使用的赋值操作符。
awk ' BEGIN { FS=":" } $1 == "root" { print "There is " NF" segments in the line" } ' /etc/passwd
awk ' BEGIN { FS=":" OFS=" " } $1 == "root" { print $1, $2, $3 } ' /etc/passwd