数据流处理命令

    xiaoxiao2024-07-14  98

    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 "s %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 M
    转载请注明原文地址: https://yun.8miu.com/read-130901.html
    最新回复(0)