首页 > 代码库 > 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,以此类推。输出的第三行也可以理解了,system和boot之间是有空格的,所以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中的NF,NR等大写变量不需要加“$”符号。
格式化输出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的特殊模式(BEGIN,END)
为上面的例子加个头和尾
[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========
BEGIN和END表示仅在awk命令执行前运行一次和结束前运行一次
本文出自 “临渊羡渔” 博客,请务必保留此出处http://aflylinux.blog.51cto.com/8056774/1581846
awk入门篇