Welcome 微信登录

首页 / 操作系统 / Linux / Linux基础篇之文本、数据流处理命令

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 ",$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 ",$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 ",NR, FNR,$4,$5,$6}" netstat.txt
指定分隔符:awk "BEGIN{FS=":"} {print $1,$3,$6}" /etc/passwd
或者awk -F: "{print $1,$3,$6}" /etc/passwd
以 作为分隔符输出:awk -F: "{print $1,$3,$6}" OFS=" " /etc/passwd
1.3 字符串匹配:~表示匹配模式开始,正则表达式匹配。--------------------------------------------------------------------------------
awk "$6 ~ /TIME/ || NR ==1 {print NR,$4,$5,$6}" OFS=" " netstat.txt
awk "$6 ~ /ESTABLISHED/ || NR==1 {print NR,$4,$5,$6}" OFS=" " netstat.txt
awk "/LISTEN/" netstat.txt
使用“/TIME|ESTABLISHED/” 来匹配TIME 或者ESTABLISHED :
awk "$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}" OFS=" " netstat.txt
模式取反:!~
awk "$6 !~ /TIME/ || NR==1 {print NR,$4,$5,$6}" OFS=" " 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[i];}" netstat.txt
统计每个用户的进程的占了多少内存:
ps aux| awk "NR!=1{a[$1]+=$6;} END { for(i ina) print i ", " a[i]"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 "
 printf"--------------------------------------------- "
}
#运行中
{
 math+=$3
 english+=$4
 computer+=$5
 printf "%-6s %-6s %4d %8d %8d %8d ", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END{
 printf"--------------------------------------------- "
 printf "TOTAL:%10d %8d %8d ", math, english, computer
 printf "AVERAGE:%10.2f %8.2f %8.2f ", 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=" " score.txt
  • 1
  • 2
  • 3
  • 4
  • 下一页
Ubuntu 使用教程:在 Ubuntu 中手动安装任何版本的 FirefoxLinux基础篇之内存管理机制相关资讯      Linux命令  Linux基础 
  • 48 字节命令可令 Linux 系统当机!  (今 07:55)
  • 在Linux笔记本上执行这句命令能致  (02月02日)
  • .NET开发必会的Linux命令  (12/20/2015 10:32:03)
  • 运维工程师必会的109个Linux命令  (03月09日)
  • 有趣的Linux命令行:随机输出唐诗  (12/28/2015 20:14:23)
  • 10 个 Linux 中的 passwd 命令示例  (10/29/2015 10:14:30)
本文评论 查看全部评论 (0)
表情: 姓名: 字数