首页 > 代码库 > awk入门篇

awk入门篇

awk简介

         awk是个数据处理工具,作用于一整行的处理,类似于sed。不过awk倾向于把一行分成数个“字段”来处理。是个强大的报告生成工具。


awk使用方法

awk [options] ‘[pattern]{action}‘ filenames


入门实例

last将登入者的数据取出来,结果如下:

[root@www ~]# last -n 5
root     pts/1        192.168.13.1     Fri Nov 14 04:54   still logged in  
root     pts/0        192.168.13.1     Fri Nov 14 01:19   still logged in  
reboot   system boot  2.6.32-504.1.3.e Fri Nov 14 01:19 - 10:50 (10+09:31) 
root     pts/1        192.168.13.1     Thu Nov 13 08:13 - crash  (17:05)   
root     pts/0        192.168.13.1     Thu Nov 13 07:19 - 10:12  (02:52)

若想去除账号与登入者的IP,且账号与IP之间以[tab]隔开,可以这样做:

[root@www ~]# last -n 5 | awk ‘{print $1"\t"$3}‘
root        192.168.13.1
root        192.168.13.1
reboot        boot
root        192.168.13.1
root        192.168.13.1

awk工作流程是这样的:读入有‘\n‘换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。输出的第三行也可以理解了,systemboot之间是有空格的,所以boot被记录在$3变量中了。


awk的内置变量:

ARGC               命令行参数个数
ARGV              
命令行参数排列
ENVIRON           
支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR               
浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                
浏览记录的域的个数
NR                
已读的记录数
OFS               
输出域分隔符
ORS               
输出记录分隔符
RS                
控制记录分隔符

红色字体的为常用变量

 

如果只显示/etc/passwd的账号和对应的shell,账号和shell之间以tab键分隔,并在首列显示行号(NR),最后列显示字段数(NF

[root@www ~]# head -5 /etc/passwd | awk -F: ‘{print "lines:"NR"\t"$1"\t"$7"\t""columes:"NF}‘
lines:1        root        /bin/bash        columes:7
lines:2        bin        /sbin/nologin        columes:7
lines:3        daemon        /sbin/nologin        columes:7
lines:4        adm        /sbin/nologin        columes:7
lines:5        lp        /sbin/nologin        columes:7

注意哦!在awk中的NFNR等大写变量不需要加“$”符号。

 

格式化输出printf

printf命令的使用格式:

printf format,item1,item2,...

 

要点:

1、其与print命令的最大不同时,printf需要指定format

2、format用于指定后面的每个item的输出格式

3、printf语句不会自动打印换行符:\n

 

format格式的指示符都以%开头,后跟一个字符;如下:

%c:显示字符的ASCII码

%d,%i:十进制整数

%e,%E:科学计数法显示数值

%f:显示浮点数

%g,%G:以科学计数法的格式或者浮点数的格式显示数值

%s:显示字符串

%u:无符号整数

%%:显示%自身

 

修饰符:

N:显示宽度

-:左对齐

+:显示数值符号

例子:

[root@www ~]# head -5 /etc/passwd | awk -F: ‘{printf "%-15s %i\n",$1,$3}‘
root            0
bin             1
daemon          2
adm             3
lp              4

 

awk的逻辑运算符(>,<,>=,<=,==,!=

上面的例子也可以这么执行:

[root@www ~]# cat /etc/passwd | awk -F: ‘NR<=5{printf "%-15s %i\n",$1,$3}‘
root            0
bin             1
daemon          2
adm             3
lp              4

 

awk的特殊模式(BEGINEND)

为上面的例子加个头和尾

[root@www ~]# cat /etc/passwd | awk -F: ‘BEGIN{printf "%-15s %s\n","Username","ID"}NR<=5{printf "%-15s %i\n",$1,$3}END{print "========END========"}‘
Username        ID
root            0
bin             1
daemon          2
adm             3
lp              4
========END========

 

BEGINEND表示仅在awk命令执行前运行一次结束前运行一次


本文出自 “临渊羡渔” 博客,请务必保留此出处http://aflylinux.blog.51cto.com/8056774/1581846

awk入门篇