您的位置:首页 > 运维架构 > Shell

shell三剑客之awk(一)

2015-10-16 20:26 525 查看
概述

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。 awk是一种优良的文本处理工具。简单来理解,awk逐行读入数据,将其赋给变量$0,然后对其进行切片处理,以$1,$2,..的切片形式,一段一段进行分析处理并输出。
语法

awk '{pattern + action}' 或者 awk 'pattern {action}'
pattern 表示 AWK 在数据中查找的内容。
action 是在找到匹配内容时所执行的一系列命令。
入门实例

1. 使用$0查看所要处理的文本内容

[root@chboa ~]# awk '{print $0}' test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
2. awk + pattern,只是输出匹配行,不做其他处理
[root@chboa ]# awk -F: '/root/' test
root:x:0:0:root:/root:/bin/bash
3. awk + action,对所有行进行处理
[root@chboa ]# awk -F: '{print $1}' testroot
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
4. awk '/pattern/{action}'匹配并处理输出
[root@chboa ]# awk -F: '/root/{print $7}' test

/bin/bash
5. 打印用户和所对应的bash,中间用tab分割

[root@chboa ~]# awk -F: '{print $1"\t"$7}' test
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
uucp /sbin/nologin
awk内建变量

gawk数据字段和数据行变量
变量
功能
FIELDWIDTHS用空格分隔开的定义了每个数据字段确切宽度的一列数字
FS输入字段分隔符
RS输入数据行分隔符
OFS输出字段分隔符
ORS输出数据行分隔符
实例

使用FS指定输入字段默认分隔符

[root@chboa sed.test]# awk 'BEGIN{FS=":"}{print $1,$2}' test
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
uucp x
2. 使用OFS指定输出字段分隔符,默认输出字段分隔符为空格

[root@chboa ~]# awk 'BEGIN{FS=":";OFS="-"}{print $1,$2,$3}' test
root-x-0
bin-x-1
daemon-x-2
adm-x-3
lp-x-4
sync-x-5
shutdown-x-6
halt-x-7
mail-x-8
uucp-x-10
3. 使用FIELDWIDTHS指定切分的固定宽度
[root@chboa ]# awk 'BEGIN{FIELDWIDTHS="6 2 3 3"}{print $1,$2,$3,$4}' test
root:x :0 :0: roo
bin:x: 1: 1:b in:
daemon :x :2: 2:d
adm:x: 3: 4:a dm:
lp:x:4 :7 :lp :/v
sync:x :5 :0: syn
shutdo wn :x: 6:0
halt:x :7 :0: hal
mail:x :8 :12 :ma
uucp:x :1 0:1 4:u
[root@chboa ~]# awk 'BEGIN{FIELDWIDTHS="6 5 8 2 1";OFS="--"}{print $1,$2,$3,$4,$5}' test
root:x--:0:0:--root:/ro--ot--:
bin:x:--1:1:b--in:/bin:--/s--b
daemon--:x:2:--2:daemon--:/--s
adm:x:--3:4:a--dm:/var/--ad--m
lp:x:4--:7:lp--:/var/sp--oo--l
sync:x--:5:0:--sync:/sb--in--:
shutdo--wn:x:--6:0:shut--do--w
halt:x--:7:0:--halt:/sb--in--:
mail:x--:8:12--:mail:/v--ar--/
uucp:x--:10:1--4:uucp:/--va--r
4. 有时候会遇到数据字段占用的多行的情况,经典例子:姓名,地址,电话号码在不同行。
目标:打印姓名,后面跟电话号码。
注解:下面这个实例awk把文件中的每一行都当成一个字段,空白行当做数据行分隔符。
[root@chboa ~]# cat phone
Myke John
Nanjing Road
(123)110110100

Xiao Ming
Zhengzhou
(456)120120100
[root@chboa ~]# awk 'BEGIN{FS="\n";RS=""}{print $1,$3}' phone
Myke John (123)110110100
Xiao Ming (456)120120100
gawk数据变量
变量功能
ARGC当前命令行参数个数
ARGV包含命令行参数的数组
ENVIRON当前shell环境变量及其值组成的关联数组
FILENAME用作gawk输入数据的数据文件的文件名
IGNORECASE设成非零值时,忽略gawk命令中出现的字符串的字符大小写
FNR当前数据文件中的数据行数
NR已处理的输入数据行的数目
NF数据文件中的字段总数
使用内部变量,打印报表

[root@chboa ~]# awk -F: '{print "filename:"FILENAME",linenumber:"NR",columns:"NF",linecontent:"$0}' test
filename:test,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:test,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
filename:test,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
filename:test,linenumber:4,columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
filename:test,linenumber:5,columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
filename:test,linenumber:6,columns:7,linecontent:sync:x:5:0:sync:/sbin:/bin/sync
filename:test,linenumber:7,columns:7,linecontent:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
filename:test,linenumber:8,columns:7,linecontent:halt:x:7:0:halt:/sbin:/sbin/halt
filename:test,linenumber:9,columns:7,linecontent:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
filename:test,linenumber:10,columns:7,linecontent:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: