手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux中正则表达式与文件格式化处理命令(awk/grep/sed)

[日期:2013-03-17] 来源:Linux社区  作者:lianxiang [字体: ]

二.awk命令

2.1awk概述

互联网中对日志分析,大多使用的是linux中的shell进行处理。此时主要使用的shell中的awk,因为awk强大的字段处理能力。下面就对其由浅入深,最后给出实例进行讲解。

首先给出一个很好的awk学习链接:http://www.cnblogs.com/chengmo/tag/awk/

awk比较倾向于将一行分成数个“字段”来处理,其运行模式为:

awk '条件类型1{动作1} 条件类型2{动作2}...'  filename

注:awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或tab键。

2.2awk入门

(1)eg: last -n 5 | awk '{print $1 "\t" $3}'

表示将登陆者的数据取出来,仅取前5行。其中$1表示当前行的第一个数据;$3表示当前行的第三个数据。

(2)awk是如何知道这个数据有几行几列呢?这需要下面的内置变量进行帮忙:

NF:每一行($0)的字段总数;NR:目前awk所处理的是第几行;FS:目前的分隔符,默认为空格键。

eg:在/etc/passwd当中是以冒号来作为字段分隔符的,该文件第一个字段为账号,第3个字段为UID,那下面要查询第3列小于10以下的数据,并且仅列出第一列与第三列,可以如下做:

cat /etc/passwd | awk ‘BEGIN{FS=":"} $3<10{print $1 "\t" $3}’

输出如下:

root 0

bin  1

注:BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。END:让用户在最后一条输入记录被读取之后发生的动作。

(3)有如下的薪资表pay.txt,内容如下:

Name  1st          2st        3st

Sean  23000    24000    25000

Zhao  21000    20000    23000

Bird2  43000    42000  41000

那如何格式化输出,并能计算每个人的总额呢?

如下考虑:第一行不需要加总,只是说明(NR==1);第二行以后,有加总(NR>=2)。

命令如下:

cat pay.txt | awk '{

if(NR==1)

printf  "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}

NR>=2{

total=$2+$3+$4

printf "%10d %10d %10d %10d %10.2f\n ",$1,$2,$3,$4,total }'

也可以这样:

cat pay.txt | awk 'NR==1{

printf  "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}

NR>=2{

total=$2+$3+$4

printf "%10d %10d %10d %10d %10.2f\n ",$1,$2,$3,$4,total }'

(4)如何查看一个文件的最后5行:tail -n 5 a.txt

如何查看有一个文件的前5行:head -n 5 a.txt

打印文件的行数:awk ‘END{print NR}’  data.txt

(5)如何查看一个文件夹下文件的个数

ls -l | awk 'END{print NR}'

注:表示处理完最后一行的时候,输出当前的NR,即文件的总行数。

(6)每4行转换成一行

awk '{if(NR%4==0){print $0}else{printf "%s",$0}}'  a.xml

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款