1. 程式人生 > 其它 >Shell grep 命令擴充套件增強

Shell grep 命令擴充套件增強

背景: 線上排查問題需要找出有某個特徵的日誌,並獲取這些日誌的完整呼叫日誌鏈路。

比如, 通過某個tag 獲取到了這些日誌的 請求id 【Span ID】,

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

然後還需要再一步取得所有SpanId的完整日誌鏈。顯然目前我們需要使用 xargs 來批處理執行。 但這裡有個問題。 grep 無法支援這種用法。

如下:

[localhost ~]$ cat xxxx.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 "\n\n" fi #shift命令用於對引數的移動(左移),通常用於在不知道傳入引數個數的情況下,依次遍歷每個引數 shift let COUNT=COUNT+1 done

原理是對調引數位置, 再通過 shift 命令移動引數,批量讀取管道傳遞過來的引數,或者 控制檯傳遞的引數。

然後 shell 指令碼便可以寫成如下:

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

完美搞定。

PS:

Shell程式設計中Shift的用法