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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
awk 博大精深,本文仅持续更新在工作中频繁使用的方法。
【AWK】 使用逻辑判断 if else
在逻辑处理过程中调用外部指令,并使用 getline 得到输出,最终赋值给变量 #!/bin/bash # # 2017/11/9 # decode etcdv3 output k/v with base64 ### "key": "foo", ### "value": "bar", ETCDCTL_API=3 etcdctl get -w json --prefix '/' |jq '.' | awk -F '"' '{
if ($2== "key" ) {
"base64 -d<<< \"" $4 "\"" |getline $4
print $1 "\"" $2 "\"" $3 "\"" $4 "\"" $5
} else if ($2== "value" ) {
"base64 -d<<< \"" $4 "\"" |getline s_decode
if (index(s_decode, "{" ) != 0) {
print $1 "\"" $2 "\"" $3s_decode$5
} else {
print $0
}
} else {
print $0
}
}' 在处理数据前,先赋值几个变量 awk - v dt_a=` date +%s` - v dt_b=` date +%s` 'BEGIN{if(dt_a==dt_b) {print 1} else {print 0}}'
截取一行数据中指定的2个数字做加减乘除运算: 请仔细对比下述3种方式的差异 [root@tvm01 asset] # echo 'aaa 1%, bbb 2%, ccc 3%, ddd 4%' |sed -r 's/.*([0-9]).*([0-9]).*([0-9]).*([0-9]).*/\1+\2/' |bc
3 [root@tvm01 asset] # echo 'aaa 1%, bbb 2%, ccc 3%, ddd 4%' |awk -F'%,' '{print $1$2}' |sed 's/[a-z]//g' |awk '{print $1+$2}'
3 [root@tvm01 asset] # echo 'aaa 1%, bbb 2%, ccc 3%, ddd 4%' |awk -F'[ %,]' '{print $2+$6}'
3 去掉空格: awk '{ result=gensub(/ /,"",1);print result }'
打印某一段内容: awk '{print $7}' access.log
统计IP数量: awk '{cs[$1]+=1} END {for(c in cs) print cs[c], c}' access.log | sort -nr
打印最后一列: awk '{print $8 " " $NF} ' access.log
统计大小: awk '{print $10 " " $1 " " $7}' access.log| awk '{B+=$1} END {print B/1024/1024 " MB"}'
统计TCP状态: netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
统计日志中http状态码: zcat 2013-07-15-0000-2330_test.company.com.*| awk '{print $9}' | sort | uniq -c| sort -nr| more
统计日志格式最后一行是源站IP的对应数据: zcat 2013-07-15-*| awk '$7~/test.company.com/{print $NF}' | sort | uniq -c| sort -nr| head
统计日志中第2行超过1M大小的URL,并打印第2行的大小和第3行的URL awk '$2~/.*M/ {print $2"\t"$3}' access.log
统计日志中18点访问 test .company.com,状态码为200的数据,打印响应时间和源站地址:
zcat 2013-07-15-18*| grep test .company.com| awk '$9=="200"{print $(NF-7),$NF}' | sort | uniq -c| sort -nr| more
统计延时超过100ms的请求: zcat 2013-07-15-18*| grep test .company.com| awk '$9=="0"&&$(NF-7)>100 {print $(NF-7)}' | sort | uniq -c| sort -nr| more
NR:整个脚本当前已经读过的记录数,就是行号,从1开始。随着所读文件的数目,一直累加。 FNR:同NR,不过是相对于当前在读的文件记录数。每开始读一个文件时,从1开始累加,相当于行号。读完一个文件后就会清0,新的文件又会从1开始。 http: //in .sdo.com/?p=1054
统计http code为502的数量,IP 假设有以下文件: cs.502 : 统计了出现502的次数和IP,格式为“次数 IP” cs.502.ip : 从cs.502中筛选出IP,格式为“IP” cs.502.country : 利用qqwry做IP到地理位置的转换,格式为“IP 地理位置” 现在的需求是,把cs.502和cs.502.country合并 awk 'NR==FNR {a[$2]=$0;next} NR>FNR {print a[$1] " "$2}' cs.502 cs.502.country >cs.502.log
计算http code 海外相对全部的占比是多少 test .all 的内容是:
46255 0 967 504 218 502 test .oversea 的内容是:
1171 0 408 504 205 502 awk 'NR==FNR {a[$2]=$1;next} NR>FNR {printf "%.2f% ", $1/a[$2]*100;print $2}' test .all test .oversea
2.53% 0 42.19% 504 94.04% 502 计算百分比: echo 55 4001638 | awk '{printf "%.4f%\n",$1/$2*100}'
根据后3位来排序: 1231234214329049203 4239049230492039402 3209402394023940234 awk '{print $0,substr($0,length($0)-2,3)}' x.txt | sort -n -k 2 | awk '{print $1}'
sed -r 's/(.*)((.){3})/\1|\2/' test .txt | sort -n -k 2 -t \| | sed 's/|//g'
去重 awk '!a[$1]++' test .log
展示 df 的简单版本,只显示磁盘分区和对应的used的值:
df -h | sed '1d' | egrep - v "" /dev/shm "|" /dev/mapper "" | awk '{print $NF"\t"$(NF-1)}' | while read a b; do echo "$a used: $b" ; done
统计swap占用的进程: for i in ` cd /proc ; ls | grep "^[0-9]" | awk ' $0 >100' ` ; do awk '/Swap:/{a=a+$2}END{print ' "$i" ',a/1024"M"}' /proc/ $i /smaps ; done | sort -k2nr | head
统计最小值,使用 BEGIN 来初始化变量, if 做循环判断,END输出结果
test .log:
96.3738 95.72002499999999 96.78004999999999 95.8748 96.146125 96.7587 96.11826666666666 96.69625 95.88227499999999 96.4341 # cat test.log |awk 'BEGIN {min=100} {if ($1<min) {min=$1;x=$1}} END {print x}' 95.72002499999999 统计服务器的cpu,内存和磁盘信息,截取小数点,四舍五入 echo ` hostname ` | cut -d '.' -f1 \
&& echo ` cat /proc/cpuinfo | grep processor | wc -l` 'C' | tr '\n' '|' \
&& cat /proc/meminfo | grep 'MemTotal' | awk '{m=$(NF-1)/1024/1024;print m"G"}' | tr '\n' '|' \
&& lsblk -o SIZE,TYPE,MOUNTPOINT | grep -E '(data|disk1)' | awk '{print $1}' \
&& echo && lsblk -o SIZE,TYPE,MOUNTPOINT && free -m | grep Mem | awk '{print "Mem="$2"M"}'
参考 1、Getline https: //www .gnu.org /software/gawk/manual/html_node/Getline_002fVariable_002fPipe .html #Getline_002fVariable_002fPipe
|
本文转自 pcnk 51CTO博客,原文链接:http://blog.51cto.com/nosmoking/1659704,如需转载请自行联系原作者