首页 > 代码库 > 浅谈awk

浅谈awk

今天在工作的时候,我又一次碰到了那些年我们懵逼的awk,不得已硬着头皮又看了一次笔记,突然间却有种毛瑟顿开的感觉,所以今天我就来聊一聊那些年我们一脸懵逼的awk。

1.awk与gawk

首先毋庸置疑的是awk是一门语言。不过相信很多小伙伴也都听说过gawk,然后就更加的一脸懵逼了,这都是啥?在这里我要告诉小伙伴的是不要懵逼look

[root@shuai ~]# which awk
/bin/awk
[root@shuai ~]# ll /bin/awk
lrwxrwxrwx. 1 root root 4 Feb 28 12:15 /bin/awk -> gawk
看到了吧这个所谓的awk不过就是gawk的一个软连接而已啦。

2.awk的一些参数。

NF:对文件使用分隔符之后的列数。

NR:行号

RS:指定行的结尾

FS:指定行切割成列的分隔符。(其实就是我们平常用的-F)

OFS:指定切割后的链接符。

在这里我来举个例子说一下。

这里关于awk的匹配我个人总结了一个公式希望对大家有用。

这是要看要匹配的字符两边如果是一样的东西,那么就-F单个匹配那个一样东西,如果不一样,那么就需要多个匹配了,就是-F[左边的右边的]’’{print}比如匹配ip

inet addr:10.0.0.253  Bcast:10.0.0.255  Mask:255.255.255.0

10.0.0.253后面是空格,前面是:不一样那么就是

 

[root@localhost etc]#  ifconfig eth0 | awk -F ‘[ :]+‘ ‘NR==2{print $4}‘

10.0.0.253

这里nr表示第二行就是inet addr:10.0.0.253  Bcast:10.0.0.255  Mask:255.255.255.0

 

 

1).查看第一行(NR)在这里我指定了NR==1

[root@shuai etc]# cat passwd.bak
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
[root@shuai etc]# awk ‘NR==1{print}‘ passwd.bak
root:x:0:0:root:/root:/bin/bash
2).将passwd.bak的内容的分隔符从\n变为:

[root@shuai etc]# awk ‘BEGIN{RS=":"}{print NR,$0}‘ passwd.bak
1 root
2 x
3 0
4 0
5 root
6 /root
7 /bin/bash
bin
8 x
9 1
10 1
11 bin
12 /bin
13 /sbin/nologin
daemon
14 x
在这里我解答一下RS就是将分隔符变为":"然后我打印行号和所有行。

3.)在上面的添加了一个指定连接符
[root@shuai etc]# awk ‘BEGIN{RS=":";OFS="@"}{print NR,$0}‘ passwd.bak
1@root
2@x
3@0
4@0
5@root
6@/root
7@/bin/bash
bin
8@x
9@1
10@1
11@bin
12@/bin
13@/sbin/nologin
daemon
14@x
15@2
这个就是我从上面的东西上添加了一个OFS=“@"然后从输出我们就能看出来行号文件的链接从" "变成了@。

3.关于一些特殊的模块

其实这个所谓的特殊模块我在这里也就只介绍两个BEGIN,END

其实BEGIN我在上面也有介绍过。

在这里我单独拿出来介绍一下用法把,“awk ‘{BEHIN{内置变量(上面介绍的NF等)类似于excl的抬头等.} {动作}}’”。

其实BEGIN他是在awk执行文件之前就运行的一些东西。所以awk在用BEGIN之后有些就不用加文件或输入了。

例子:

[root@shuai etc]# awk -F ‘[ :]+‘ ‘BEGIN{print "    name      ","ID"} $3~/^41/ { print $1$2,$3}‘ /server/files/reg.txt
    name       ID
ZhangDandan 41117397
LiuBingbing 41117483
2)END模块

当理解了BEGIN模块之后理解END模块就简单了很多。END模块是在文件执行结束之后才执行的。所以如果你有END那么你必须要有输入。(end模块其实里面基本添加的都是一些输出)

例子

awk ‘/^root/ {i++}END{print i}‘ /etc/passwd

比如这个(我前面加上一个匹配以root开头的passwd文件。如果有一个我就i+1,最后在end输出)。

本文出自 “我的学习” 博客,请务必保留此出处http://shuai12138.blog.51cto.com/10118203/1902470

浅谈awk