2016-09-28 43 views
0

我有所有以時間戳記開頭的日誌文件,然後是日誌級別,然後是消息,我想要一個擺脫時間戳的腳本。Bash刪除每行之前的第一個空白的所有內容

也就是說,我想一個腳本,爲文件的每一行會變成:

21:22:34.571 DEBUG - some message 

DEBUG - some message 

我沒有使用bash的多,因此任何建議,將不勝感激。

+1

'切-d'-f2- file.log' – anubhava

+1

何時日期出現在日誌文件中 - 絕不會,或者僅在午夜之後或每小時或之後發佈第一條消息之前?這很重要,因爲如果日期行之前沒有時間戳(他們可能不應該是這樣),那麼你需要讓這些人獨自離開。使用'cut'或類似'sed's/^ [^] * //'的東西的機制變得不太合適 - 你需要對你的匹配更加嚴格。我會注意到將日期退出可能不是一個好主意,但那是你的問題,不是我的。 –

+0

我試圖比較兩組日誌以找出它們之間有什麼不同,當它說由於時間戳每一行都不同時,很難做到這一點。 – annedroiid

回答

1

如果你可以用AWK:

awk '$1="";1' data_file_name 

否則,使用shell(非常非常慢):

#!/bin/bash 
while read -r line; do 
    printf '%s\n' "${line#* }" 
done <"data_file_name" 
+0

請注意,'awk'腳本在輸出行上留下前導空白。 shell代碼在這方面是乾淨的。 –

+0

@JonathanLeffler更糟的是,'awk'代碼通過賦值給'$ 1',導致'$ 0'通過在它們之間插入'OFS'來重新構造所有參數。它破壞了田野之間的白色空間分隔。 – Kaz

+0

@Kaz有[這個答案與236完全相同的投票](http://stackoverflow.com/a/2961994/6843677)。如果你想要[保持空格使用這個(可能是選項4)](http:// stackoverflow。com/a/32774373/6843677),但這對於這個簡單的需求來說似乎太多了。 – sorontar

2

您可以嘗試要麼根據輸入數據sedcut

sed -e 's/^[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}.[0-9]\{3\}//' <data_file_name> 


cut -c 13- <data_file_name> 
+0

評論(嘲笑娛樂而不是更嚴重):在shell腳本中使用''不是一個好主意 - 它看起來像是拙劣的I/O重定向。使用一個簡單的名字:'data_file_name'或者'log.file'或者其他合適的,註釋「假設數據在'log.file'」或類似的東西。使用'「$ @」'也可以很好;它表示'處理腳本的所有文件名參數,或者沒有標準輸入'。 –

+1

此外,使用'sed's/^ [^] * //''可能會更簡單 - 刪除所有非空白,直到包括第一個空白。你的腳本實際上並沒有刪除空白。 –

+0

@JonathanLeffler在這兩種情況下你都是對的。問題是關於一個想法。我提出了兩個想法。沒有更多 – GMichael

0

grep也可以通過簡單地提取每一個空間之後荷蘭國際集團

$ cat ip.txt 
21:22:34.571 DEBUG - some message 
21:23:34.571 DEBUG - some other message 

這會留下一個空白領先

$ grep -o ' .*' ip.txt 
DEBUG - some message 
DEBUG - some other message 

這不會

$ grep -oP ' \K.*' ip.txt 
DEBUG - some message 
DEBUG - some other message 
相關問題