1. awk如何工作
awk和流编辑器sed在工作原理和用法上有很多类似之处,它们都是检查输入数据中的行是否匹配指定的模式,如果匹配成功就对匹配的行执行相应的操作,重复这个过程指导所有的输入数据都被处理完,因此awk和sed都是面向数据流的工具。此外,awk和sed的相似之处还体现在两者使用的语法式很类似,都是使用正则表达式匹配来确定要操作的行。与sed不同的是,awk执行的操作要写在模式后面的花括号{}中。
案例1:显示出系统中某个特定用户(如root用户)的用户名、用户ID以及主目录。
#提取passwd文件中某一行的三个字段
$awk –F: ‘/^root:/{print $1,$3,$6;}’/etc/passwd
root 0 /root
解析:/etc/passwd文件的各个字段是由冒号隔开,而awk的默认分隔符是空格,所以通过命令行选项-F:来指定;$1,$3,$6是指第一、三、六字段;
案例2:输出系统中所有用户的用户名及相应的用户ID的表格,并在表格的第一行为这两列数据添加标题。
具体代码实现如下[user.awk]:
#在主循环开始以前打印标题,使下面的数据的含义更加明确
print title to clarify the following databefore main loop begin
BEGIN {
printf "%-15s%s\n","USERNAME","UID";
printf"--------------\n";
}
#主循环开始运行
#从/etc/passwd文件中提取用户名和UID
{
printf "%-15s%s\n",$1,$3;
}
#通过选项-f指定要运行的awk程序
$awk –F: -f user.awk /etc/passwd
案例3:如何显示出当前系统中所有用户ID大于等于1000的用户?
#使用比较表达式,而不是模式匹配
$awk –F: ‘$3>=1000{ printf “User:%-15sUID:%s\n”,$1,$3;}’ /etc/passwd
格式:
expression { actions; }
当有多高表达式时,使用逻辑与&&和逻辑或||把多个表达式连接在一起构成更复杂的表达式,如搜索当前系统中所有使用bash和C Shell的用户:
$awk –F: ‘($7==”/bin/bash”)|| ($7==”/bin/csh”) { printf “User:%-15sUID:%-15sShell:%s\n”,$1,$3,$7; }’/etc/passwd
案例4:
2. 使用变量
awk 程序中的变