sed和awk是比较基础的类Unix系统中批量处理文本的好东西。sed负责做行的编辑,awk负责做列编辑。这里将说一点这方面的知识。需要明白的一点就是他们的处理都是按照行来做的处理。
sed
命令格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
基本的命令格式:
[address[,address]][!]command[agruments]
选项
选项 | 意义 |
---|---|
-n | 安静模式 |
-e | 输入多个编辑指令 |
-i | are neat |
-f | 引导sed脚本文件名。 |
常用命令
选项 | 意义 |
---|---|
a | 追加 |
d | 删除命令 |
s | 替换命令,支持正则的替换 |
i | 插入 |
p | 输出,通常和-n一块使用 |
c | 将制定地址直接替换 |
r | [address]r file,将文件内容插入到address位置 |
w | [address]w file,将address位置内容写入到文件中 |
sed实例
awk
命令格式
awk [-F field-separator] 'commands' input-file(s)
最基本用法
$ ps aux | awk '{print $2}'
这样将会打印出当前在运行的进程的编号。如果你想在首部尾部添加自己的打印
$ ps aux | awk 'BEGIN {print "this is head"} {print $2} END {print "this is tail"}'
在awk中内置的变量
变量 | 意义 |
---|---|
ARGC | 命令行参数个数 |
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
FNR | 浏览文件的记录数 |
FS | 设置输入域分隔符,等价于命令行 -F选项 |
NF | 浏览记录的域的个数 |
NR | 已读的记录数 |
OFS | 输出域分隔符 |
ORS | 输出记录分隔符 |
RS | 控制记录分隔符 |
在最后实例里面计算平局值的时候就使用了NR。
printf语法
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
awk运算符
在处理文本的时候可以做一些简单的运算
运算符
= += -= = /= %= ^= *=
逻辑
|| 逻辑或
&& 逻辑与
~ ~! 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
数学计算
-
- 加,减
- / & 乘,除与求余
-
- ! 一元加,减和逻辑非
^ * 求幂
++ – 增加或减少,作为前缀或后缀
- ! 一元加,减和逻辑非
实例
计算最大值、合计、平均值
参考
在awk里面执行分为两个单元,每行处理的时候在前面那个括号里执行。END之后{}中的内容就是用于做
$ cat test.log
0 0 147.086
0 10 141.269
0 20 10000
0 30 2805.22
0 40 152.003
0 50 144.762
0 60 144.926
最大值
cat test.log | awk '{if(m<$3) m=$3} END{print m}'
{
if(m<$3) m=$3
}
END {
print m
}
合计
cat test.log | awk '{m+=$3} END{print m}'
{
m+=$3
}
END {
print m;
}
平均值
cat test.log | awk '{m+=$3} END{print m}'
{
m+=$3
}
END {
print m/NR;
}