zoukankan      html  css  js  c++  java
  • Shell grep 命令扩展增强

    背景: 线上排查问题需要找出有某个特征的日志,并获取这些日志的完整调用日志链路。  

    比如, 通过某个tag 获取到了这些日志的 请求id 【Span ID】,

    cat xxxx.log | grep '某tag' | awk  -F '某tag' '{print $2}' 

    然后还需要再一步取得所有SpanId的完整日志链。显然目前我们需要使用 xargs 来批处理执行。 但这里有个问题。 grep 无法支持这种用法。

    如下:

    [localhost ~]$ cat xxxxxx.log | grep '某tag' | awk  -F '某tag' '{print $2}'  | xargs grep xxxxxx.log
    
    grep: 某SpanId: No such file or directory

    grep 第一个参数必须是 关键词正则 ,其后跟随文件路径。

    所以为了解决这个问题,我们需要使用一个改造后的SHELL脚本,这里命名为 grepx ,用于增强 grep 命令: 

    #!/bin/bash
    
    FILE_PATH="$1*"
    
    COUNT=0
    while  [ $# -gt 0 ]
    do
        if [ $COUNT -gt 0 ]
        then
            grep "$1" $FILE_PATH
            #输出空白行用来隔断日志   
           echo -e "
    
    "
        fi
    
        #shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下,依次遍历每个参数
        shift
        let COUNT=COUNT+1
    done

    原理是对调参数位置, 再通过 shift 命令移动参数,批量读取管道传递过来的参数,或者 控制台传递的参数。 

    然后 shell 脚本便可以写成如下: 

    cat xxxxxx.log | grep '某tag' | awk  -F '某tag' '{print $2}'  | xargs ~/grepx xxxxxx.log

    完美搞定。

    PS:

    Shell编程中Shift的用法

  • 相关阅读:
    go 基本包
    go 包
    算法笔记--数据结构--链表
    算法笔记--数据结构--队列
    算法笔记--标准模板库STL--pair
    算法笔记--标准模板库STL--stack
    算法笔记--标准模板库STL--priority_queue
    算法笔记--标准模板库STL--queue
    初识pair
    lower_bound实现离散化
  • 原文地址:https://www.cnblogs.com/phpdragon/p/14891056.html
Copyright © 2011-2022 走看看