awk用法实例

简介:

1.统计以下文本内容中每个数字出现的次数

1
2
3
4
5
6
7
8
9
10
11
12
[liuwei@ test  tmp]$  cat  1.log 
1 2
2 3
3 4
100 1 
100 100 100
[liuwei@ test  tmp]$  awk  '{for(i=1;i<=NF;i++)s[$i]++}END{for(key in s)print key,s[key]}'  1.log
4 1
100 4
1 2
2 2
3 2

2.统计上面文本中100出现的次数

1
2
3
4
5
6
7
8
#方法1
[liuwei@ test  tmp]$  awk  '{for(i=1;i<=NF;i++)if($i==100)sum++}END{print sum}'  1.log
4
#方法2
[liuwei@ test  tmp]$  awk  '{for(i=1;i<=NF;i++)s[$i]++}END{for(key in s)if(key==100)print key,s[key]}'  1.log 
100 4
#方法3,不用awk进行统计
[liuwei@ test  tmp]$  grep  -o  "100"  1.log |  wc  -l

3.统计下面语句中,每个单词及字符出现的个数

  the squid project provides a number of resources toassist users design,

  implement and support squid installations. Please browsethe documentation 

  and support ections for more infomation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#统计字符出现次数
[liuwei@ test  tmp]$  grep  -o  "\w"  word.txt |  awk  '{s[$1]++}END{for(key in s)print key,s[key]}'
#统计每个单词出现次数
#方法1,直接遍历每行的每个字段进行累计
[liuwei@ test  tmp]$  awk  -F  '[ ,.]+'  '{for(i=1;i<=NF;i++)s[$i]++}END{for(key in s)print key,s[key]}'  word.txt
for  1
toassist 1
number 1
users  1
project 1
of 1
more  1
ections 1
documentation 1
resources 1
a 1
provides 1
Please 1
browsethe 1
installations 1
and 2
support 2
implement 1
the 1
infomation 1
squid 2
design 1
#方法2,利用输入字段分隔符把每个单词变为单独的一行再行进统计
[liuwei@ test  tmp]$  awk  - v  RS= '[ ,.]+'  '{s[$1]++}END{for(key in s)print key,s[key]}'  word.txt

4.打印出haproxy.log(nginx,tomcat等都可以用)中指定时间段内的日志,以便于进行分析

1
2
3
[liuwei@ test  tmp]$  awk  '{if($3>="20:00:00" && $3<="20:15:59")print $0}'  haproxy.log
也可以写为:
[liuwei@ test  tmp]$  awk  '$3>="20:00:00"&&$3<="20:15:59"{print $0}'  haproxy.log

5.AWK笔试题-->获取本机的IP地址和掩码

1
2
3
4
5
6
7
8
9
10
#方法一,利用脚本的配置文件(source)进行获取,source的作用是将某个文件变成此脚本的配置文件
source  /etc/sysconfig/network-scripts/ifcfg-eth0
printf  "IP地址:%s\t子网掩码:%s\n"  $IPADDR $NETMASK
#方法二:利用awk地址定界
file = /etc/sysconfig/network-scripts/ifcfg-eth0
awk  -F=  '/IPADDR/,/NETMASK/{print $2}'  $ file
#方法三:利用awk的或条件
awk  -F=  '$1=="IPADDR"||$1=="NETMASK"{print $1,$2}'  $ file
知识点1: source 的作用
知识点2: awk 匹配连续多个字段的写法; /IPADDR/ , /NETMASK/ 表示匹配IPADDR与NETMASK之间的所有内容

6.统计当前服务器每个外部IP的连接个数

1
2
3
4
5
#方法1,原理-->先以空格为分隔符得到第5个字段,再以冒号为分隔符得到IP字段
[liuwei@ test  tmp]$  netstat  -tan |  awk  '/^tcp\>/{print $5}'  awk  -F:  '{s[$1]++}END{for(key in s)print key,s[key]}'
#方法2,利用split函数-->需要知道split函数每个参数是什么意思,此方法看起来很高端啊
netstat  -tan |  awk  '/^tcp\>/{split($5,ip,":");s[ip[1]]++}END{for(key in s)print key,s[key]}'
知识点: awk split 函数的用法,在此例中表示以冒号为分隔符将$5的内容进行分隔,存储到ip数组中

7.要求文件a里的数据依次替换文件b中的xxx字样。

   [liuwei@test tmp]$ cat a

   aaa

   bbb

   ccc

   ddd

   [liuwei@test tmp]$ cat b

   111 xxx

   222 xxx

   333 xxx

   444 xxx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#方法1,利用getline函数进行实现
[liuwei@ test  tmp]$  awk  '{getline i<"a";print $1,i}'  b
111 aaa
222 bbb
333 ccc
444 ddd
#方法2,同时利用geline,sub函数进行实现
[liuwei@ test  tmp]$  awk  '{getline i<"a";sub("xxx",i,$2)}1'  b
111 aaa
222 bbb
333 ccc
444 ddd
知识点1:getline函数用于从文本中按行读取内容,并且可以将内容赋值给变量
知识点2: awk 中sub函数的用法,在此例中表示查找$2中的第一次出现的xxx,并且用变量i的值进行替换
知识点3: awk 中gub函数的用法,跟sub函数用法一样,不过sub只替换第一次找到的,gub表示替换全部的

8.统计第2列的和;统计第1列中出现的内容,并统计出对应的第2列的和

    [root@instance-d4u5ahgn tmp]# cat sumb.txt 

    1 76

    2 78

    1 75

    2 99

    4 100

    3 12

1
2
3
4
5
6
7
8
9
#统计第2列的和
[root@instance-d4u5ahgn tmp] # awk '$1==1{sum+=$2}END{print sum}' sumb.txt
151
#统计第1列中出现的内容,并统计出对应的第2列的和
[root@instance-d4u5ahgn tmp] # awk '{s[$1]+=$2}END{for(key in s)print key,s[key]}'  sumb.txt
4 100
1 151
2 177
3 12
本文转自激情燃烧的岁月博客51CTO博客,原文链接http://blog.51cto.com/liuzhengwei521/1927746如需转载请自行联系原作者                                                                               weilovepan520


相关文章
|
3月前
|
Perl
awk的复杂用法
awk的复杂用法
30 3
|
3月前
|
Perl
awk的具体用法
awk的具体用法
23 1
|
Shell Linux Perl
|
Shell Docker Perl