页面加载中...

Linux格式化处理工具awk

| Linux | 0 条评论 | 802浏览

Preface

如果要格式化的报文或文本文件中抽取数据,那么awk可以完成这些任务。它 在文本浏览和数据的熟练使用上性能优异。

用法

awk的使用使用格式如下:

awk [-F field-separator] 'command' input

[-F field-separator]为分隔符,awk默认是以空格作为分割符的,可以不写。如果是其他分割符,用-F指定。如:awk -F, 'command' input 。这里指定逗号为分隔符;
command 为awk的命令,即对输入的一个操作;
input 为一个输入,比如某个文件或者管道过来的。

awk脚本

域及内置变量

awk执行时,其浏览域标记$1,$2 . . . $ n。$0就表示所有的域。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。
为打印一个域或所有域,使用print命令。这是一个awk动作(动作语法用圆括号括起来)。

此外,awk中还有一些内置变量:

  • ARGC 命令行参数个数
  • ARGV 命令行参数排列
  • ENVIRON 支持队列中系统环境变量的使用
  • FLENAME awk浏览的文件名,因为 a w k可以同时处理许多文件,因此如果访问了这个变量,将告之系统目前正在浏览的实际文件
  • FNR 浏览文件的记录数,FNR支持awk目前操作的记录数。其变量值小于等于NR
  • FS 设置输入域分隔符,等价于命令行-F选项
  • NF 浏览记录的域个数
  • NR 已读的记录数
  • OFS 输出域分隔符,指定输出域分隔符,缺省为空格。如果想设置为 #,写入OFS = " # "
  • ORS 输出记录分隔符。缺省为新行( )。
  • RS 控制记录分隔符。缺省为新行( )。

比如,我们通过 ps aux | head -10 命令先查询进程信息如下:

如果,只是想要进程号、该进程cpu、内存占用率情况,即对应图中第1,3,4列,这时可以使用awk命令了。

ps aux | head -10 | awk '{print $1,$2,$4}'

这时只会打印第1,2,4列的数据了。

或者也可以自己指定打印的分割符。如:

ps aux | head -10 | awk '{print $1"->"$2"->"$4}'


加上行号,打印第一行及最后一行
awk '{print NR,$1,$NF}'

条件操作

awk同样也可以在'command'中指定条件,从而输出条件符合的内容。条件包括条件判断、正则匹配、表达式等等。

awk的操作符同基本的shell脚本里面的操作符。
awk的正则匹配使用符号 ~ 来跟正则表达式。

同样以上面 ps aux | head -10 结果为例。找最后一列数据含有'migration'的行:

ps aux | head -10 | awk '$NF ~ /migration/'

*这里需注意:如果是这种表达式的话,就不能带{},只有条件语句才能带上{},如上面这个记录等同于:

ps aux | head -10 | awk '{if($NF~/migration/) print $0}'

或者不需要正则,直接精确匹配:

ps aux | head -10 | awk '$NF=="[migration/0]"'

内置函数

awk还内置了许多强大的字符串函数


比如,拆分一个字符串,使用substr函数

awk '{print substr("abc#edf#123",1,5)}'

结果返回 abc#e

一个例子

假设系统中有很多僵死进程,比如很多没有正常退出的编辑命令vim。首先需要找到这些进行,而后一个个的kill掉。手动的kill掉肯定很麻烦,所有我们通过脚本的方式:脚本如下:

#!/bin/bash
#找到所有的vim进程号,赋值给数组parray
parray=`ps -ef | grep vim | awk '{print $2}'`
for i in ${parray[*]}
        do
                kill -9 $i
        done

这个脚本很简单,就是先通过awk找出所有的vim的进程id,赋值给parray,最后再循环遍历所有的元素给kill掉

发表评论

最新评论

    来第一个评论吧!