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的用法

  • 相关阅读:
    Java异常处理和设计
    一次qps测试实践
    Alternate Task UVA
    Just Another Problem UVA
    Lattice Point or Not UVA
    Play with Floor and Ceil UVA
    Exploring Pyramids UVALive
    Cheerleaders UVA
    Triangle Counting UVA
    Square Numbers UVA
  • 原文地址:https://www.cnblogs.com/phpdragon/p/14891056.html
Copyright © 2011-2022 走看看