我有一個程式碼片段,用於解析日誌檔案並列印我需要的資訊。
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;
exit
awk 指令在列印第一個符合項目後退出。
或者
只需將命令的輸出透過管道傳輸for
到下面的 awk 命令,
for .... | awk -F'[(/]' '{print $2;exit}'
答案2
您不需要for
循環 - 單一呼叫grep
將輸出檔案中的所有匹配行,因此您只需一遍又一遍地重複相同的操作,次數與檔案中的行數相同。
從技術上講,您不需要兩者都需要awk
,grep
因為兩者都可以進行文字匹配。如果您想要更具體的答案,請發布日誌檔案的摘錄以及您想要的輸出的範例。
答案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
。