找回密码
 骑士注册

QQ登录

微博登录

搜索
❏ 站外平台:

Linux中国开源社区 技术 查看内容

数据流处理命令

2014-04-17 13:20    评论: 11 收藏: 8 分享: 1    

1. awk:文本和数据处理工具

awk擅长于对数据进行分析并生成报告,简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

使用方法:awk '{pattern + action}' {filenames}  

其中pattern 表示awk 在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。pattern就是要表示的正则表达式,用斜杠括起来。准备实例操作文件:netstat  -t >> netstat.txt

1.1 打印输出:

print,格式化打印输出:printf

awk '{print$1, $4}' netstat.txt
awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt

1.2 过滤记录:

awk '$3==0 && $6=="LISTEN"' netstat.txt

其中的“==”为比较运算符。其他比较运算符:!=,>, <, >=, <=

awk '$3>0 {print $0}' netstat.txt

加入表头:内建变量NR

awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.txt

再加上格式化输出                     

awk '$3 ==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt

ps:awk的内建变量

$0        当前记录(这个变量中存放着整个行的内容)
$1~$n        当前记录的第n个字段,字段间由FS分隔

FS        输入字段分隔符默认是空格或Tab
NF        当前记录中的字段个数,就是有多少列
NR        已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR        当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS        输入的记录分隔符,默认为换行符
OFS        输出字段分隔符,默认也是空格
ORS        输出的记录分隔符,默认为换行符
FILENAME        当前输入文件的名字

输出行号:

awk '$3 ==0 && $6=="ESTABLISHED"|| NR==1 {printf "%02s %s %-20s %-20s %s\n",NR, FNR,$4,$5,$6}' netstat.txt

指定分隔符:

awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd

或者awk -F:

'{print $1,$3,$6}' /etc/passwd

以\t作为分隔符输出:

awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd

1.3 字符串匹配:

~表示匹配模式开始,正则表达式匹配。

awk '$6 ~ /TIME/ || NR ==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
awk '$6 ~ /ESTABLISHED/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
awk '/LISTEN/' netstat.txt

使用“/TIME|ESTABLISHED/” 来匹配TIME 或者ESTABLISHED :

awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt

模式取反:!~

awk '$6 !~ /TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt

或者awk '!/WAIT/' netstat.txt

1.4 拆分文件:

使用数据流重定向”>”

awk 'NR!=1 {print > $6}' netstat.txt      NR!=1表示不处理表头

把指定的列输出到文件:  

awk 'NR!=1{print $4,$5 > $6}' netstat.txt

使用程序流进行条件拆分:if else

awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt";
else if($6 ~ /LISTEN/) print > "2.txt";
else print > "3.txt"}' netstat.txt

1.5 统计

计算所有的C文件,CPP文件和H文件的文件大小总和:

ls -l *.cpp *.c*.h | awk '{sum+=$5} END {print sum}'

统计各个connection状态的用法:使用数组

awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a;}' netstat.txt

统计每个用户的进程的占了多少内存:

ps aux| awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a"KB";}'

数组:因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

1.6 使用脚本进行文本、数据处理

BEGIN、END关键字:BEGIN表示处理所有行之前的标识,END表示处理完所有行后的标识,具体语法:

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

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

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

实例操作文件:cat cal.awk

#!/bin/awk -f
#运行前
BEGIN {
   math= 0
   english= 0
   computer= 0

   printf"NAME    NO.     MATH  ENGLISH  COMPUTER   TOTAL\n"
   printf"---------------------------------------------\n"
}
#运行中
{
   math+=$3
   english+=$4
   computer+=$5
   printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END{
   printf"---------------------------------------------\n"
   printf "TOTAL:%10d %8d %8d \n", math, english, computer
   printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR,computer/NR
}

执行:awk -f cal.awk score.txt

1.7 变量声明和环境变量:

使用-v参数进行变量声明,ENVIRON关键字表示环境变量

$ x=5
$ y=10
$ export y                          #y被export为环境变量
$ echo $x $y
5    10
$awk -v val=$x '{print $1, $2, $3, $4+val, $5+ENVIRON["y"]}' OFS="\t" score.txt
123下一页
查看其它分页:

最新评论

我也要发表评论

绿色圣光 2014-04-17 13:26 回复
都是常用的命令,不过我一直没能好好学习awk的用法,uniq没用过,其他的用的比较多。
无名的城堡 2014-04-17 14:35  新浪微博网友评论 回复
nuance小窝 2014-04-17 14:35  新浪微博网友评论 回复
Repost
冷面邪恶书生 2014-04-17 15:11  新浪微博网友评论 回复
回复@绿色圣光:uniq 都是结合管道处理日志重复行
绿色圣光 2014-04-17 15:58  新浪微博网友评论 回复
回复@冷面邪恶书生:这样啊,学习一下,以后难免会用到。
拿AK47的耶稣 2014-04-17 17:01  新浪微博网友评论 回复
這个有用
游客 2014-04-17 23:43 回复
赞一下awk
游客 2015-03-02 11:57 回复
真心觉得不错!!
sofuc.com 2015-03-11 06:18 回复
踩一脚。。。
contra_mundi 2015-08-01 16:33 回复
$sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' pets.txt
     This is my cat
    my cat's name is betty
    This is my dog
    my dog's name is frank
    This is my fish
    my fish's name is george
    This is my goat
    my goat's name is adam

不知道我哪里错了,得不到下面的结果
cat:betty
dog:frank
fish:george
goat:adam
a172525630 2015-08-06 15:52 回复
不错哦!

收藏

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。