Linux三剑客:grep awk sed

介绍shell

  • Shell价值:任务流程自动化、数据处理、不被技术栈所约束

一个简单的任务引入shell三剑客
任务:检查首页是否有死链?

  1. 确定检查的接口:curl https://testing-studio.com/

  2. 将返回的响应存储到某文件:curl https://testing-studio.com/ > /tmp/testingStudio.html

  3. 正则匹配响应中的链接:curl -s https://testing-studio.com/ | grep href | grep -o "http[^\"']*" 其中curl -s 表示不展示网络相关信息

  4. 检查所有的链接是否有死链

    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 | lessless 表示所有的输出进入一个交互环境里

    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

思路:

  1. awk 页面地址 所有种类
  2. 过滤干扰字符?
  3. 统计/topics、/topic/replies 、uploads/photo、uploads/user
  4. 统计诸如此类请求:/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:当前时间后,实时读取

回到最原始的问题–排错

日志查看最多的当属应用服务器日志,那他都有哪些信息呢?

  • 运行日志:记录各种请求行为
  • 异常日志:客户端的操作请求不满足条件,比如:参数不足、没有权限等,正常的异常情况
  • 错误日志:异常的异常情况。比如:空指针异常、堆栈溢出、下标越界,一般会对应边界性测试场景,这种日志除了相关请求内容,还会记录异常的一些详细信息。

还有一类日志是服务器性能日志,可以为性能测试提供机器性能数据,作为性能调优的依据。

一些简单的日志用法:

  1. 日常测试,根据应用服务器日志进行排错;
  2. 日志需要日常检查与管理的;比如:定期删除等
  3. 服务计算问题、定时task执行等,与业务相关但因为没有界面的直接展示,可以借助日志进行总体数据回查与监控;
  4. nginx流量统计–根据access.log日志,可以为性能测试提供一些需求指标,比如各页面访问量;
  5. 性能测试过程中,作为性能调优的参考指标。
发布了16 篇原创文章 · 获赞 0 · 访问量 587

猜你喜欢

转载自blog.csdn.net/LittleGirl_orBoy/article/details/104593121