Shell grep 命令擴充套件增強
阿新 • • 發佈:2021-06-16
背景: 線上排查問題需要找出有某個特徵的日誌,並獲取這些日誌的完整呼叫日誌鏈路。
比如, 通過某個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}' | xargsgrep 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: