首页 > 代码库 > 浅尝awk

浅尝awk

前几天写了sed,这次来继续学习一下它的好兄弟,awk,用了两者,一个这样的感觉,两者都可以用来处理匹配,如果想对文本做处理,sed的删除,匹配,替换要用的频繁一些,如果要深入文本的每一行,对每一行进行一些列处理,例如,统计,然后格式化输出,awk就可以派上用场了

查看自己ubuntu当前的awk

which awk,其实用的是/usr/bin/mawk


在学习sed篇中,我们知道,sed是读取文本的每一行到一个模式空间,然后对模式空间的内容进行处理,其实awk差不多,它也是对模式空间进行处理,但是它做的处理动作时"切片"

1.awk的变量

为什么要先说变量呢,因为不用变量,awk基本上就是废(游戏玩多了^-^)

首先我们把/etc/passwd里面的第一行取出来备用

head -1 /etc/passwd > test.txt

$0  当前处理的记录(默认是行,除非指定RS)

awk ‘BEGIN{FS=":"}{print $0}‘ test.txt
root:x:0:0:root:/root:/bin/bash

$1---$n 当前的第几个字段,和命令行参数类似

awk ‘BEGIN{FS=":"}{print $1,$3}‘ test.txt

FS 这里记住:F表示域field,S表示分隔seperate

这里有两种写法:我喜欢用这种,简洁明了

awk -F: ‘{print $1,$2,$3}‘ test.txt

RS 想想,R表示记录record,S同上

awk ‘BEGIN{RS=":"}{print $1,$3}‘ test.txt
NF number of field 可以理解为多少列

awk ‘BEGIN{FS=":"}{print NF}‘ test.txt

NR number of record 可以理解为多少行

awk ‘BEGIN{FS=":"}{print NR}‘ test.txt

OFS  FS是处理这行的时候的分隔,O是指输出,OFS就是指输出时候的分隔符

awk ‘BEGIN{FS=":"}{print $1,$2,$3}‘ OFS="#" test.txt

ORS 同理


2.awk的格式化输出

awk的处理完文本之后还可以按照格式化进行输出,很强大吧,其实说白了就是printf

awk -F: ‘{printf "%s#%s#%s\n" ,$1,$2,$3}‘ test.txt
%d 十进制整数

%f 浮点数

%s 字符串

%% 百分号

- 左对齐

虽然简单,但是灵活运用,效果特殊


3.awk的算术运算

awk支持的运算符:+ - * / % **  awk甚至提供了一些数学函数sin(x),cos(x)等

还可以做一些统计运算,统计某一列的值

awk ‘{ sum += $1 }; END { print sum }‘ file
awk ‘NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}‘

4.模式

awk ‘模式{命令}‘ file

模式可以是一下几种:

1.正则表达式

awk -F : ‘/^r/{print $1}‘ /etc/passwd
2.表达式

awk -F: ‘$3>=500{print $1,$3}‘ /etc/passwd
awk -F: ‘$7 ~/bash$/{print $1,$7}‘ /etc/passwd
awk -F: ‘$7 !~/bash$/{print $1,$7}‘ /etc/passwd
3.BEGIN和END

BEGIN{ 这里面放的是执行前的语句 }

END {这里面放的是处理完所有的行后要执行的语句 }

{这里面放的是处理每一行时要执行的语句}

例如:

awk ‘BEGIN{test="123";print test}‘
发现其实没有文件也可以使用awk,因为BEGIN不依赖于输入,但是注意打印内部变量不必使用$