今天在工作的时候,我又一次碰到了那些年我们懵逼的awk,不得已硬着头皮又看了一次笔记,突然间却有种毛瑟顿开的感觉,所以今天我就来聊一聊那些年我们一脸懵逼的awk。
1.awk与gawk
首先毋庸置疑的是awk是一门语言。不过相信很多小伙伴也都听说过gawk,然后就更加的一脸懵逼了,这都是啥?在这里我要告诉小伙伴的是不要懵逼look
[[email protected] ~]# which awk
/bin/awk
[[email protected] ~]# 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后面是空格,前面是:不一样那么就是
[[email protected] 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
[[email protected] 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
[[email protected] etc]# awk ‘NR==1{print}‘ passwd.bak
root:x:0:0:root:/root:/bin/bash
2).将passwd.bak的内容的分隔符从\n变为:
[[email protected] 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.)在上面的添加了一个指定连接符
[[email protected] etc]# awk ‘BEGIN{RS=":";OFS="@"}{print NR,$0}‘ passwd.bak
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]/root
[email protected]/bin/bash
bin
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]/bin
[email protected]/sbin/nologin
daemon
[email protected]
[email protected]
这个就是我从上面的东西上添加了一个OFS=“@"然后从输出我们就能看出来行号文件的链接从" "变成了@。
3.关于一些特殊的模块
其实这个所谓的特殊模块我在这里也就只介绍两个BEGIN,END
其实BEGIN我在上面也有介绍过。
在这里我单独拿出来介绍一下用法把,“awk ‘{BEHIN{内置变量(上面介绍的NF等)类似于excl的抬头等.} {动作}}’”。
其实BEGIN他是在awk执行文件之前就运行的一些东西。所以awk在用BEGIN之后有些就不用加文件或输入了。
例子:
[[email protected] 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输出)。