awk文本处理常见用法
2011-07-19 TsengYia#126.com http://tsengyia.blog.chinaunix.net/
#################################################################
系统环境:
RHEL 5.5 [2.6.18-194.el5]
软件环境:
gawk-3.1.5-14.el5
#################################################################
一、基本格式
1. 命令格式
awk'模式或条件{编辑指令}' 文件1 文件2 ... #//过滤并输出内容
awk -f awk脚本文件 文件1 文件2 ... #//从脚本中读取执行编辑指令,过滤并输出内容
2. 关于编辑指令
1)编辑指令的分隔
编辑指令部分若包含多条语句,则以分号分隔。
对于多条编辑指令,可使用以分号分隔的多个{ }区块。
2)区块构成
BEGIN { 编辑指令 } #//开始处理第一行文本之前的操作,此区块可不指定数据文件
{ 编辑指令 } #//针对每一行文本的处理操作
END { 编辑指令 } #//处理完最后一行文本之后的操作
3)几个特殊的内建变量
FS #//指定每行文本的字段分隔,缺省为空格或制表位
NF #//当前处理行的字段个数
NR #//当前处理行的序数(行号)
$0 #//当前处理行的所有文本(整行内容)
$n #//当前处理行的第n个字段
FILENAME #//被处理的数据文件名
RS #//数据记录分隔,默认为\n,即每行为一条记录;若改为“”,则以空行分隔的多行连续文本视为一条记录
二、应用举例
1. 按行输出文本
awk '{print}' bfile #//输出所有内容,等同于 cat bfile
awk '{print $0}' bfile #//输出所有内容,等同于 cat bfile
awk 'NR==1,NR==3{print}' bfile #//输出第1行至第3行的内容
awk '(NR>=1)&&(NR<=3){print}' bfile #//输出第1行至第3行的内容
awk '(NR==1)||(NR==3){print}' bfile #//输出第1行、第3行的内容
awk '(NR%2)==1{print}' bfile #//输出所有奇数行的内容
awk '(NR%2)==0{print}' bfile #//输出所有偶数行的内容
awk '/^root/{print}' /etc/passwd #//输出以root开头的行
awk '/nologin$/{print}' /etc/passwd #//输出以nologin结尾的行
awk 'BEGIN {x=0}; /\/bin\/bash$/{x++}; END {print x}' /etc/passwd
#//统计以/bin/bash结尾的行数,等同于 grep -c "/bin/bash$" /etc/passwd
awk 'BEGIN {RS=""}; END {print NR}' /etc/squid/squid.conf
#//统计以空行(一个或多个)分隔的文本段落数
2. 按字段输出文本
awk '{print $3}' bfile #//输出每行中(以空格或制表位分隔)的第3个字段
awk '{print $1,$3}' bfile #//输出每行中(以空格或制表位分隔)的第1、3个字段
awk -F ":" '$2==""{print}' /etc/shadow #//输出密码字段为空的用户的shadow记录
awk 'BEGIN {FS=":"}; $2==""{print}' /etc/shadow' #//输出密码字段为空的用户的shadow记录
awk -F: '$7~"/bash"{print $1}' /etc/passwd #//输出以冒号分隔且第7个字段中包含/bash的行的第1个字段
awk '($1~"nfs")&&(NF==3){print $1,$2}' /etc/services
#//输出包含3个字段且第1个字段中包含nfs的行的第1、2个字段
awk -F: '($7!="/bin/bash")&&($7!="/sbin/nologin"{print})' /etc/passwd
#//输出第7个字段既不为/bin/bash也不为/sbin/nologin的所有行
3. 通过管道、双引号调用Shell命令
awk -F: '/bash$/{print | "wc -l"}' /etc/passwd
#//调用 wc -l 命令统计使用bash的用户个数,等同与 grep -c "bash$" /etc/passwd
awk 'BEGIN {while("w" | getline) n++; print n-2}'
#//调用w命令,用来统计当前在线用户数
awk 'BEGIN {"hostname" | getline; print$0}'
#//调用hostname命令,用来输出当前的主机名
#################################################################
阅读(1617) | 评论(0) | 转发(0) |