介绍shell
- Shell价值:任务流程自动化、数据处理、不被技术栈所约束
一个简单的任务引入shell三剑客
任务:检查首页是否有死链?
-
确定检查的接口:
curl https://testing-studio.com/
-
将返回的响应存储到某文件:
curl https://testing-studio.com/ > /tmp/testingStudio.html
-
正则匹配响应中的链接:
curl -s https://testing-studio.com/ | grep href | grep -o "http[^\"']*"
其中curl -s 表示不展示网络相关信息 -
检查所有的链接是否有死链
curl https://testing-studio.com/t/topic/45 -v 2>&1
将标准错误重定向到标准输出
1表示标准输出1
2表示标准错误2
0表示标准输入0
>file表示输出重定向到另一个文件curl https://testing-studio.com/t/topic/45 -v 2>&1 | less
less 表示所有的输出进入一个交互环境里curl -I https://testing-studio.com/t/topic/45
-I表示发送一个简单的请求,展示返回码,可以直接根据返回码判定当前是否为死链curl -s https://testing-studio.com/ | grep href | grep -o "http[^\"']*" | while read line;do curl -s -I $line | grep 200 && echo 200 $line || echo ERR $line;done
while read line;do curl -s -I $line
对响应中匹配的url发送请求
grep 200
:匹配200 ,输出结果:HTTP/1.1 200 OK
&& echo 200 $line || echo ERR $line;done
:打印请求结果注意点:双引号这边注意转义、while循环、管道& || 条件判断
日志检索&统计任务
-
日志数据检索
awk:匹配器
awk '$9!~/200/' nginx.log
$9 文件中第九个元素,分隔符为空格
awk:匹配动作
默认匹配动作是{print $0}
awk '$9~/500/{print $0}' filename
$0 表示整行
$1表示第一个字段,以此类推
$N表示第N个字段
$NF表示最后一个字段
注意:不同检索结果的diff,用于验证检索条件是否正确-统计404请求码
cat nginx.log |grep " 404 " > 1
cat nginx.log | grep '1" 404 ' >2
diff 1 2
后续可对比对结果再次进行筛选统计等
-
日志数据统计-统计ip访问量
统计日志非200状态码的数量
awk '$9!~/200/{print $9}' nginx.log | sort |uniq -c
统计url类型非200状态码的数量
awk '$9!~/200/{print $7}' nginx.log | sort | uniq -c | sort -nr |less
其中less,显示少量数据,空格加载其他,即可以用交互性模式浏览内容,流式加载
more命令。上述结果,类型并不直观,需要将同类型的报错归为一类,用sed
-
数据文件修改
个性且类型一致的请求归为一类
写法1: awk '$9!~/200/{print $7}' nginx.log | sed -E 's/[0-9]{3,}/_d_/g' | sort | uniq -c | sort -nr | head -5
写法2: awk '$9~/404/{print $7}' nginx.log | sed -E 's#/[0-9]{3,}#_d_#g' | sort | uniq -c | sort -nr
sed -E 's/[0-9]{3,}/_d_/g'
-E是在匹配多个以上的情况下出现,扩展表达式
head -5
展示前5条记录
一键搭建服务
python2 -m CGIHTTPServer 8989
python3 -m http.server
CGI-Bin技术
//todo
管道概念,上一命令的输出传递给下一命令
echo 333 | cat
输入333 传递给cat,打印出来
cat
命令是输入什么打印什么
Linux三剑客:grep、awk、sed
grep = select * from table 数据查找定位【基于正则表达式查找满足条件的行】
- -i 忽略大小写
- -v 不显示匹配的行
- -o 把每个匹配的内容用独立的行显示
- -E 使用扩展正则表达式
- -A 打印命中数据的上下文
- -r dir/递归搜索
grep -n “匹配项” filepath 查找某行,找到行数
more +行数 filepath 定位某条日志,查看信息
正则表达式
题目:打印访问量最高的页面地址
页面地址类型:
/
/cable
/topics/1276
/topics/132514/replies/125
/123AAAaaa_=
其他
awk '{print $7}' nginx.log \
| sed 's#?.##g' \
| sed -E 's#/topics/[0-9]{1,10}#/topics#' \
| sed -E 's#/replies/[0-9]{1,10}#/replies#' \
| sed -E 's#/uploads/photo/([a-z]{1,10}/)*([0-9]{1,10}/)*#/uploads/photo/#' \
| sed -E 's#![a-z]{1,10}##g' | sed -E 's#-##g' \
| sed -E 's#uploads/photo/([0-9]*[a-z]*)*#uploads/photo#' \
| sed -E 's#/uploads/user/([a-z]{1,10}/)*([0-9]{1,10}/)*#/uploads/user/#' \
| sed -E 's#uploads/user/([0-9]*[a-z]*)*#uploads/user#' \
| sed -E 's#cable#*cable#' | sed -E 's#topics#*topics#' \
| sed -E 's#^/(([a-z]+)|([A-Z]+)|([0-9]+)|([0-9]*[a-z]*[A-Z]*_*=*)*)$#/zzzuser#' \
| sort |uniq -c | sort -nr | head -10
思路:
- awk 页面地址 所有种类
- 过滤干扰字符?
- 统计/topics、/topic/replies 、uploads/photo、uploads/user
- 统计诸如此类请求:/123AAAaaa_= 【需要避免影响其他统计,可以将其他统计的名字修改为不易混淆的类型,如*】
正则表达式概念:
^起始
&结尾
+1个及以上
*0个及以上
?0或1个
{}约束
()范围
|或关系,满足关系中的一个
[0-9][A-Z][a-z]区间
awk = select field from table 数据切片awk ‘pattern{action}’
以下是awk pattern语法:
- awk ‘BEGIN{}END{}’ 开始和结束
- awk ‘/Running/’ 正则匹配
- awk ‘/aa/,/bb/’ 区间选择
- awk '$2~/xxx/'字段匹配
- awk 'NR==2’取第二行
- awk 'NR>1’去掉第一行
- awk 内置变量:FS字段分隔符、OFS输出数据的字段分隔符、RS记录分隔符、ORS输出字段的行分隔、NF字段数、NR记录数
sed = update table set field =new where field =old 数据修改 sed [addr]X[options]
- -e 表达式
- sed -n ‘2p’ 打印第二行
- sed ‘s#hello#world#’ 修改
- -i 直接修改源文件
- -E扩展表达式
- –debug调试
less、cat、tail、head、more:输出文件作用
cat
:全部一次性打印
less
:可以用交互性模式浏览内容,流式加载,具实时性
head -n
:取前n条数据
tail -n
:取后n条数据
tail -f
:当前时间后,实时读取
回到最原始的问题–排错
日志查看最多的当属应用服务器日志,那他都有哪些信息呢?
- 运行日志:记录各种请求行为
- 异常日志:客户端的操作请求不满足条件,比如:参数不足、没有权限等,正常的异常情况
- 错误日志:异常的异常情况。比如:空指针异常、堆栈溢出、下标越界,一般会对应边界性测试场景,这种日志除了相关请求内容,还会记录异常的一些详细信息。
还有一类日志是服务器性能日志,可以为性能测试提供机器性能数据,作为性能调优的依据。
一些简单的日志用法:
- 日常测试,根据应用服务器日志进行排错;
- 日志需要日常检查与管理的;比如:定期删除等
- 服务计算问题、定时task执行等,与业务相关但因为没有界面的直接展示,可以借助日志进行总体数据回查与监控;
- nginx流量统计–根据access.log日志,可以为性能测试提供一些需求指标,比如各页面访问量;
- 性能测试过程中,作为性能调优的参考指标。