2017-05-07 117 views
0

我有一個日誌文件保存在我的電腦上,我希望創建一個腳本來解析。我的目標是從日誌文件的每一行中拉出兩個值,然後在同一行中將它們相鄰(可能是連字符分隔)並輸出,然後遍歷日誌中的每一行。例如,以下日誌:將兩個bash循環結果值輸出到同一行?

123-abc-thething01, 6, 1234, metadata, metadata, [email protected], metadata, 123abc 
123-abc-thething02, 6, 1234, metadata, metadata, [email protected], metadata, 123abc 
123-abc-thething03, 6, 1234, metadata, metadata, [email protected], metadata, 123abc 

運行該腳本將有望實現後...

123-abc-thething01 - [email protected] 
123-abc-thething02 - [email protected] 
123-abc-thething03 - [email protected] 

此刻,我有以下的代碼是拉動正確的價值觀,但它是簡單地輸出所有'var1',然後輸出所有的'var2',如下所示,而不是逐行掃描,在一行上輸出第1行的var1和var2值,然後在新行上輸出var1和第2行的var2等等

123-abc-thething01 123-abc-thething02 123-abc-thething03 
[email protected] [email protected] [email protected] 

我花了一些時間嘗試不同的方式做到這一點,但我有點難住。我現在不是很強烈,所以任何幫助將不勝感激。謝謝。

#!/bin/bash 

for i in logfile.txt 
do 
    var1=$(cat logfile.txt | awk '{print $1}' | sed 's/,//g') 
    var2=$(cat logfile.txt | grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*') 
done 

echo ${var1} 
echo ${var2} 
+1

你不應該使用shell腳本來解析文本文件,例如這可以只使用awk awk -F,{print $ 1「 - 」$ 6}'文件來完成 – 123

+0

根據你的更新需求,你也可以使用perl'perl -ne'print「$ 1 - $ 2 \ n」如果/([^,]+).*,([[:alnum:] ._-] + @ [[:alnum:] ._-] + )/'' – 123

+0

謝謝!這很方便,我想我會採用這種方法。 – Dronzil

回答

1

使用bash:

#!/bin/bash 

while IFS="," read -r -a array 
do 
    # remove leading white space from element 5 
    echo "${array[0]} - ${array[5]/# /}" 
done < logfile.txt 

輸出:

 
123-abc-thething01 - [email protected] 
123-abc-thething02 - [email protected] 
123-abc-thething03 - [email protected] 

如果可能的話用awk這項工作。

+0

嗨,居魯士,謝謝你這真的很有幫助!我應該可能提到過,電子郵件地址可以在每個日誌行內的任何位置,而不僅僅是位置5(我的壞)。這就是爲什麼我想使用正則表達式,但是在這種情況下你會碰巧有一個建議嗎?謝謝 – Dronzil

+0

爲什麼要將一個簡短高效的awk腳本改爲while循環? – 123

+0

@Dronzil電子郵件地址中唯一可以與正則表達式匹配的部分是'@'。您將任何其他東西放入電子郵件正則表達式中都有可能導致有效地址失敗。如果這是處理用戶提交的真實世界地址,那麼您確實需要另一種方式來跟蹤地址所在的字段。 – ccarton

1

使用awk

awk -F', ' '{printf "%s - %s\n", $1, $6}' log.file 
+1

這將在$ 6 – 123

+0

公平點之前有額外的空間。改變了它。 – hek2mgl