Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2264500
  • 博文数量: 168
  • 博客积分: 6641
  • 博客等级: 准将
  • 技术积分: 1996
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-02 11:49
文章存档

2020年(4)

2019年(6)

2017年(1)

2016年(3)

2015年(3)

2014年(8)

2013年(2)

2012年(12)

2011年(19)

2010年(10)

2009年(3)

2008年(17)

2007年(80)

分类: LINUX

2011-07-19 20:47:41

 
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命令,用来输出当前的主机名
 
#################################################################
阅读(1545) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~