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;
}

186

被折叠的 条评论
为什么被折叠?



