雨翔河
首页
列表
关于
野路子走法 - shell 脚本管道命令捞日志有感
2020-06-22 10:51
> 捞日志和日志过滤分析几乎是家常便饭,但是因为shell脚本的命令每次都是用完就扔,没有在脑子里做过停留,所以想写个博客记录下,免得下次用又得查使用的正确姿势。 运营人员想要一批数据,这批数据正好又没有做落地存储,只打印了日志,大致的需求是这样的: 从海量的日志里找出某天某快递公司接口没有返回手机号或者手机号为空的数据个数。 上面这个需求大致可以拆分成如下步骤: 1. 从日志里过滤出原单号校验接口的日志。 2. 过滤出包含xx快递公司的。 3. 过滤出包含用户手机号clientPhone字符的日志。 4. 对该日志包含的字符 clientPhone 进行分割成数组块,取第二个块。 5. 之后对数据进行逗号分割成数组块,对第一个块的字符长度大于10的进行输出第一块的内容。 6. 对输出结果进行次数统计。 ``` zcat /app/logs/*/xxxService/info.2020-06-17*log.gz | grep -a 'XXXXController.expressIdValid'| grep -a 'YTO' | grep -a 'clientPhone' | awk -F 'clientPhone' '{print $2}' | awk -F ',' '{if(length($1) > 10 ) print $1}' | wc -l ``` 这个命令写的还行,就是执行起来很慢,在日志服务器上跑了40分钟之后才出结果,有一个很有趣的事情就是, 这么复杂的命令,对于linux系统来说,到底是单进程跑呢还是多进程协助一起跑,理论上在我们开发人员眼中,既然都可以拆分出步骤,那么肯定可以在代码层面多线程执行,效率会很高,但是linux有这么聪明吗? 事实告诉我,linux真的很聪明,这行命令在系统层面居然还真的进行了拆分,由多个进程去执行不同的事情,如图: ![](https://cdn.yuxianghe.net/image/blog/79-1.jpg) 说实话,我是惊呆了,就跟第一次见到大海的感觉。 我简单的查了下网上的文章,可以从这一篇文章中找到答案: https://zhuanlan.zhihu.com/p/47168082 如果任意一端的进程突然挂掉了会发生什么? 假设命令是这样的 ' cmd1 | cmd2 ' 假设 cmd1 先挂掉,管道写被动关闭,cmd2 在读取管道内容时会遭遇 EOF,然后正常结束。 假设 cmd2 先挂掉,管道读被动关闭,cmd1 继续写管道,这时候进程会收到一个 SIGPIPE 信号,默认动作是进程直接退出。
类型:工作
标签:shell,grep,awk,linux
Copyright © 雨翔河
我与我周旋久
独孤影
开源实验室