将工作内容自动化是所有测试人员必备的技能。除了标准的自动化测试框架可以解决自动化测试的需求之外,在工作中,经常需要快速查看或者执行一些小的操作,Shell可以辅助工作1. 流程自动化 2. 数据处理。Shell三剑客+Shell基础知识,可以应用到性能测试领域,UI自动化测试领域,自动化打包等等都是一样的原理。
Shell三剑客:
- grep
- awk
- sed
1. Shell - grep
grep - 数据查找定位。
- 语法:grep pattern file
- grep -i pattern file :忽略大小写
- grep -v pattern file :
- grep -o pattern file :
- grep -E pattern file :
- grep -A -B -C pattern file :
- grep pattern -r/-R dir/ :递归搜索
举例:
-
grep -R spark ./*
在有上百个sql文件的目录下,返回的是包含 spark 的sql文件名。 -
grep 'main' *
查找当前目录下的文件中是否包含“main”文本。 -
cat ./overview.html |grep -A1 "passRate suite" |grep -v "passRate suite" |sed s/[[:space:]]//g'
返回测试结果报告中passRate的百分比 -
curl -s https://testerhome.com/ | grep href | grep -o "http[^\"']*" | while read line; do curl -s -I $line | grep 200 && echo 200 $line || echo ERR $line; done
查找并返回某个网页内所有链接打开状态是不是200
2. Shell - awk
awk - 数据切片处理,数据统计。
- awk理论上可以替代grep。
- awk是Linux下的一个命令,同时也是一种语言解析引擎。
- 语法:awk ‘parttern{action}’
- 内置变量:
- FS:字段分隔符
- OFS:输出数据的字段分隔符
- RS:记录分隔符
- ORS:输出字段的行分隔符
- NF:字段数
- NR:记录数
举例:
-
报了多少次404: awk '$9 ~/404/' ./nginx.log | wc -l
-
多少个链接报了404: awk '$9 ~/404/' ./nginx.log | awk '{print$7}' | sed -E 's/[0-9]{3,}/_d_/g' |sort | uniq -c | sort -nr | wc -l
找出log中的404的报错数据,统计共有多少404报错. -
awk '{print$1}' ./nginx.log | sort | uniq -c | sort -nr | head -1
在log中找出访问量最高的ip 统计分析 -
netstat -tnp | grep ':22' | awk '{print$5}'| awk -F: '{print$1}' | sort | uniq -c| sort -nr | wc -l
统计有多少个独立ip正在访问22端口。
注意:netstat命令在Mac和Linux上是含义不同的2个命令。
3. Shell - sed
sed - 数据修改
- 语法:sed [addr]X[options]
- -e :表达式
-
sed -n '2p'
打印第二行 -
netstat -tnp | sed 1,2d | awk '{print$4}' | awk -F: '{print$1}' | sort | uniq -c| sort -nr
sed 1,2d:删除前2行数据。 -
awk ‘$9!~/200/{print $7}’ ./nginx.log | sed -E ’s/[0-9]{3,}/_d_/g’ | sort | uniq -c | sort -nr | head -5
使用sed,替换url中动态参数的部分,精确统计非200的所有链接:
通常情况下,grep、awk、sed会混合使用,达到精确定位数据位置、统计数据、修改替换数据的目标。
再看一个使用top命令,分析性能数据的例子:
统计进程id是22056的cpu和mem数据,输出20次并计算平均值。
top -b -d 1 -n 20 -p 22056 | grep --line-buffered 22056 | awk 'BEGIN{OFS="\t";print "cpu", "mem", "avgc", "avgm"}{c+=$9; m+=$10;print $9, $10, c/NR, m/NR}END{print "===="}'
cpu mem avgc avgm
0.0 2.1 0 2.1
0.0 2.1 0 2.1
0.0 2.1 0 2.1
0.0 2.1 0 2.1
0.0 2.1 0 2.1
0.0 2.1 0 2.1
0.0 2.1 0 2.1
====