awk的使用---业务需求-创新互联-成都创新互联网站建设

关于创新互联

多方位宣传企业产品与服务 突出企业形象

公司简介 公司的服务 荣誉资质 新闻动态 联系我们

awk的使用---业务需求-创新互联

awk是按照流来处理的,所以处理1-5G的文本数据相对还是可以的!

10年积累的成都网站建设、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有剑河免费网站建设让你可以放心的选择与我们合作。

求和

awk -F : -v sum=0 '{sum+=$3} END{print sum}' /etc/passwd

或者

awk -F :  '{sum+=$3} END{print sum}' /etc/passwd

默认变量为0

规定日志格式

$17为domainname

$19为request

$21为响应状态码

应用1: 匹配统计F5日志中,含有某个域名的数量

可以按照以下方法来套

[root@CentOS-6-121 scripts]# awk -F:  '$1=="root" {print $0}' /etc/passwd | wc -l 1

对以上进行改版,因为统计的时候利用了wc -l 进行了,现在不需要wc -l ,awk完成统计

[root@CentOS-6-121 scripts]# awk -F:  -v n=0 '{if($1=="root") n++;}  END{print n}' /etc/passwd  1

-v 可以指定变量,在 awk ''中利用变量的时候直接使用,不需要"$n" 这个地方要区别shell

注意: 以下语句,默认不指定n变量的时候,虽然可以出结果,是因为在n++的时候会默认设置n为0,但是这样会出现bug,当没有匹配的时候,去大于n的时候就不是0而是空

[root@CentOS-6-121 scripts]# awk -F:   '{if($1=="root") n++;}  END{print n}' /etc/passwd  1

bug:

[root@CentOS-6-121 scripts]# awk -F:   '{if($1=="rooot") n++;}  END{print n}' /etc/passwd  [root@CentOS-6-121 scripts]#

应用2: 使用shell中的变量和定义多变量 和逻辑运算符

&& 逻辑与

|| 逻辑或

! 否

~ 匹配字符串  !~  不匹配后面更正则表达式

-v key1=value1 -v key2-values

引用变量两种方式

1

name="John"

  -v myname=$name '{print myname}'

2 在awk中我们可以通过“’$变量名’”的方式读取sell scrpit程序中的变量。

name="John"

awk '{print $1,$2,"'$name'"}'  flil

原型:

awk -v t=0 -v domain="$domain" -v request="/main/detail" -v code=500 '$17==domain && $19 ~ request && $21 ==code {t++} END{print t}' access.log

0

测试语句:

[root@CentOS-6-121 scripts]# awk -F: '$1=="root" && $3==0 {print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash

awk -F: '$1 =="root" || $1=="nobody" {print $1 "\t"$3}' /etc/passwd

nobody-2

root0

awk -F: '$NF != "/bin/bash"  {print $1 "\t" $NF}' /etc/passwd

匹配:

awk '$NF !~ "/sbin/no*" {print $1" " $3}' /etc/passwd

awk '$NF !~ /sbin\/no*/ {print $1" " $3}' /etc/passwd  (使用 ~ /express/ 是man awk 中正规的写法)

注意:

判断匹配的方法:

 1)$n~正则表达式

 2)if($n~正则表示式) print $

如果你的awk中使用了 BEGIN语句,就一定要使用 if 不能使用模式匹配,否则报错

如:

报错:

[root@CentOS-6-121 scripts]# awk -F: '$1=="root" && $3==0 BEGIN{n=0} {n++} END{print n}' /etc/passwd

awk: $1=="root" && $3==0 BEGIN{n=0} {t++} END{print t}

awk:           ^ syntax error

改为:

[root@CentOS-6-121 scripts]# awk -F: 'BEGIN{n=0} {if($1 =="root" && $3==0)n++} END{print n}' /etc/passwd 1 使用变量: [root@master ~]# n=1000 [root@master ~]# awk -v n=$n -F: '$3==n {print $1" "$3}' /etc/passwd elasticsearch 1000

应用3: awk中的数组

awk -F : '{bash_array[$NF]++} END {for(i in bash_array) {print i,bash_array[i]}}' /etc/passwd

/bin/nologin 1

/sbin/shutdown 1

/bin/false 1

/bin/bash 11

/sbin/nologin 28

/sbin/halt 1

/bin/sync 1

3指定域名的

[root@shnh-bak001 f5-log]$ awk '$17 =="gold.dianpingfang.com" {++domain[$21]} END {for(k in domain) print k,domain[k]}' access.log

 2

200 4498

301 2

500 15

302 321

304 2

应用四:统计目录下的一部分目录的数据大小

du -s stu* | awk '{sum=sum+$1} END{print sum}'

数据库的连接情况

netstat -tanp |awk '/3306/ {print $5}'  |awk -F ":" '{a[$1]++}END{for (i in a) print a[i],i}'  |sort -nr

应用五:行范围指定

AWK 的匹配模式种类:

 Patterns

    AWK patterns may be one of the following:

       BEGIN

       END

       /regular expression/

       relational expression

       pattern && pattern

       pattern || pattern

       pattern ? pattern : pattern

       (pattern)

       ! pattern

       pattern1, pattern2

awk -F : '{print $NF":"$2":"$3":"$4":"$5":"$6":"$1 > "/tmp/oldboy/passwd"}' /tmp/oldboy/passwd

打印第2、3、4、5行

sed -n "2,5p" /etc/passwd

awk "NR==2,NR==5" /etc/passwd

awk "NR>1&&NR<6" /etc/passwd

cat /etc/passwd | head -5 | tail -4

实例:

 awk -F: 'NR==2,NR==5 {print $1}' /etc/passwd

awk -F: 'NR>1 && NR<6{print $1}' /etc/passwd

案例6: 打印awk第一次匹配到的关键字,之后的所有行!

分两步,第一找出第一次匹配的行,匹配nobody账号

awk -F ":" '{if($1 ~ "nobody") print NR;}' passwd

15

25

思考,如何只匹配到一次后,就退出awk继续向下匹配而直接退出查找。

改良:

awk -F ":" '{if($1== "nobody") {print NR; exit 0}}' passwd

15

第二: 打印第15行之后的所有行

awk -F ":" '{if(NR > 15) print $0;}' passwd

或者(以下行范围更适用)

awk -F: 'NR>15{print $1}' /etc/passwd

可以提高难道综合成一条awk语句

awk -F ":" '{if($1== "nobody") {a=NR}} {if(NR>a && a!=0) print $0}' passwd

为什么要做一个a!=0 的条件,因为没有匹配到nobody的时候,未定义赋值过的变量再awk中默认值为0。

 

案例七: awk中调用系统命令

awk -F ":" '{if($1== "nobody") {system("echo this is noboy user")}} ' passwd

或者: $1=="root" 字符串一定要用引号引起来,不然在awk里面就是变量拉

awk -F ":" '$1=="root" {system("echo this is noboy user")} ' /etc/passwd

案例7: awk多分隔符切,分隔符为[

rabbitmq的集群状态 partitions行  {partitions,[]}]  如果[] 中有内容i表示集群不正常。

if [ "x" != "x$(sudo /usr/sbin/rabbitmqctl cluster_status |grep partitions |awk -F '[\\[\\]]'  '{print $2}')" ];then echo 0;else echo 1;fi

案例8:  统计nf(iptables 跟踪链表中 各协议的数量)

awk '{a[$3]++ } END{for (k in a) print k,a[k]}' /proc/net/nf_conntrack

tcp 11

udp 26

icmp 1

案例7. 使用split内置函数进行分割

tac  haproxy.log  | awk '{                                         split($6,a,":")                                         if(a[1]~"05/Mar/2017"){                                              print $0                                         }                                         if(a[1]~"04/Mar/2017"){exit}                                 }' >> ./a_access.log  exit

案例8: 打印匹配的行并 输出文件名

awk '/root/{print FILENAME "-----"$0}' /etc/passwd

#FILENAME 是默认变量,或者使用grep实现

grep -H root /etc/passwd

#-H 是显示文件名在匹配的行前面

内置函数的使用

split的用法:

一、split 初始化和类型强制
      awk的内建函数split允许你把一个字符串分隔为单词并存储在数组中。你可以自己定义域分隔符或者使用现在FS(域分隔符)的值。
格式:

  split (string, array, field separator)
  split (string, array)  -->如果第三个参数没有提供,awk就默认使用当前FS值。

例2:计算指定范围内的和(计算每个人1月份的工资之和)

1

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:awk的使用---业务需求-创新互联
地址分享:http://kswsj.cn/article/eddsj.html