僅列印第一個匹配項一次

僅列印第一個匹配項一次

我有一個程式碼片段,用於解析日誌檔案並列印我需要的資訊。

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/ {print $7}' 
 done;

問題是當我輸入時,它會多次顯示答案:

(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.280.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.284.3.17454802.933.1401109176.283.1)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109696.2)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109706.51)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109758.100)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109773.149)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109810.198)
(1.3.51.0.1.1.10.10.30.48.2084865.2084839/1.2.840.113619.2.80.977011700.14346.1401109818.247)

有什麼辦法可以修剪它,這樣我只能將第一個系列的資料顯示一次。我只需要1.3.51.0.1.1.10.10.30.48.2084865.2084839打印一次。

我也嘗試將其更改為這樣,但 Bash 不喜歡它:

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/' |
        awk -F'[(/]' ' {print $2, exit}'
done;

然後嘗試了這個:

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk -F'[(/]' '/\([a-zA-Z0-9.]+/ {print $2, exit }'
done;

答案1

試試這個,

for i in $(cat ~/jlog/"$2"); do
        grep "$1" ~/jlog/"$2" |
        awk '/\([a-zA-Z0-9.]+/ {print $7; exit}' 
done;

exitawk 指令在列印第一個符合項目後退出。

或者

只需將命令的輸出透過管道傳輸for到下面的 awk 命令,

for .... | awk -F'[(/]' '{print $2;exit}'

答案2

您不需要for循環 - 單一呼叫grep將輸出檔案中的所有匹配行,因此您只需一遍又一遍地重複相同的操作,次數與檔案中的行數相同。

從技術上講,您不需要兩者都需要awkgrep因為兩者都可以進行文字匹配。如果您想要更具體的答案,請發布日誌檔案的摘錄以及您想要的輸出的範例。

答案3

您還沒有解釋您實際上在做什麼,所以我會做一些假設。我假設您正在運行一個名為 的腳本foo.sh,並為其提供一個字串和一個文件名作為參數。然後它們分別變成$1$2。據推測,您正在使用類似的東西來運行它

foo.sh SearchPattern LogFileName

無論如何,for循環 i) 完全無用,因為您沒有使用循環i創建的變數for i in ...。 ii)非常錯誤,因為這將使i每個值都取值單字而不是您可能想到的整個生產線 iii) 所有問題的原因。您多次獲得相同的結果,因為您多次執行完全相同的命令。文件的每一行都會得到一個結果。

不管怎樣,你想要的東西可以透過簡單的事情來完成

grep "$1" ~/jlog/"$2" | awk '/\([a-zA-Z0-9.]+/ {print $7}' 

或者,更簡單:

awk '/'"$1"'/\([a-zA-Z0-9.]+/ {print $7}' ~/jlog/"$2"

awk注意,"$1"不在單引號內。這使得 bash$1在傳遞到 之前將其擴展為當前保存的內容awk

相關內容