实习整理(五)

实习第五周。这周的主要工作内容是协助开发和QA跑case,由于最近我所在的组任务不多,大家的工作主要是修修补补,或者是增加一些小功能。实习了一个多月,目前为止收获最大的地方就是更加熟悉了Linux开发,这点能从我最近写的实习总结中看出来。

周四,leader让我把在线航空公司常见的接口错误统计出来,也就是把航司的错误从日志中搂出来,需要写shell脚本来实现,简单记录一下。

先上脚本:

1
2
3
4
5
6
7
#! /bin/bash
atnodes 'zgrep -o " Code=\"\\w\{3,\}\" " {logname}.log.2017-07-0[8-9]-*.gz ' {hostname1}[3-4] {hostname2}[3-6] > icaair_provider.log
gawk '{ print $2 }' icaair_provider.log | gawk -F '=' '{ print $2 }' | sort > icaair_provider.code
cat icaair_provider.code | uniq -c

atnodes 把{hostname1}[3-4] {hostname2}[3-6]这些机器上的日志全都取出来,当然要通过zgrep正则表达式的过滤,不然日志太多,最后把得到的日志写到文件icaair_provider.log里。

awk是一个强大的文本分析工具,它把文件逐行读入,按照分隔符(默认空格)将每行切片,然后再对切开的部分进行各种分析处理,非常适合处理日志数据。具体见这篇文章。总之第二行就是根据第一步得到的文件icaair_provider.log切分日志,得到想要的那一列,然后用sort排序,最后写入文件icaair_provider.code里。

最后一行,用uniq统计在icaair_provider.code中的所有错误出现的次数。

Note:
这里我要说的是写正则表达式需要注意的问题。首先看看维基百科是怎么描述正则表达式的。

regular expression

总结起来就是,正则表达式是一个美国数学家搞出来的一门语言,也可以说是一门科学。你想啊,它能被称作是科学,一定是严谨的正确的不容质疑的,但是它偏偏有两套标准,也可以叫两套语法,分别是POSIX standard和Perl syntax。这两套语法都是对的,按照任何一个语法写出来的正则都是对的。重点是最后一句话,很多编程语言提供对正则表达式的支持,或者内置,或者通过引用包。举个例子来讲,上帝说,人要住在房子里,于是给出房子的定义:能遮风挡雨抵挡野兽的建筑就是房子。虽然有了房子的定义,但是不够具体,于是上帝手下的两个天使开始制定标准,也就是POSIX和Perl。至于编程语言就是建房子的工人,它按照制定的标准实现了正则表达式,但是每个编程语言实现正则的方式方法不尽相同。

理解了这点就明白了为什么我在http://regexr.com/ 上写的正则明明是对的为啥放在java里或者shell里就不好使了。http://regexr.com/ 是对正则标准的检查,它不是language-specific的。


最后记录一段脚本,功能是统计file2中的每行在file1中出现的次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash
if [ $# -lt 2 ]
then
echo "Usage:$0 args error"
exit 0
#get the first file
file1=$1
#get the second file
file2=$2
while read myline
do
grep -E -o "${myline}" $file1 | awk ' { count[$0]++ }
END{printf("%-20s%s\n","Word","Count");
for(word in count)
{printf("%-20s\t%s\n",word,count[word])}
}'
done < $2

最后的最后,总结bash脚本里面大于/等于…关键词:

Item Value
-eq 等于
-ne 不等于
-le 小于等于
-ge 大于等于
-lt 小于
-gt 大于

Written with StackEdit.