sed和awk常用方法

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

你可能感兴趣的:(Linux,sed,awk)