2012-07-09 69 views
1

我想根據給定的日期範圍從文件中提取文本。日期範圍將由用戶決定,但在這裏我只是使用固定範圍。使用grep如何按日期範圍提取文本?

文件內容如下:

[email protected]:~$ zgrep added new.txt 
Jul 02 21:03 : update: added Linkin Park/Living Things(2012)/02 - Linkin Park - In My Remains.mp3 
Jul 02 21:03 : update: added Linkin Park/Living Things(2012)/03 - Linkin Park - Burn It Down.mp3 
Jul 07 10:33 : update: added Linkin Park/Living Things(2012)/04 - Linkin Park - Lies Greed Misery.mp3  
Jul 09 07:54 : update: added Linkin Park/Living Things(2012)/04 - Linkin Park - Lies Greed Misery.mp3 

現在,讓我們假設我想提取日期Jul 07Jul 09之間的文本。所以我用下面的命令爲

zgrep added new.txt | sed '/"Jul 09"/,/"Jul 07"/p' 

這給了我下面的輸出

Jul 02 21:03 : update: added Linkin Park/Living Things(2012)/02 - Linkin Park - In My Remains.mp3 
Jul 02 21:03 : update: added Linkin Park/Living Things(2012)/03 - Linkin Park - Burn It Down.mp3 
Jul 07 10:33 : update: added Linkin Park/Living Things(2012)/04 - Linkin Park - Lies Greed Misery.mp3 
Jul 09 07:54 : update: added Linkin Park/Living Things(2012)/04 - Linkin Park - Lies Greed Misery.mp3 

所以,你可以看到它並沒有考慮range我給sed的。

我的問題是什麼應該是根據日期範圍提取文本的正確方法。

+0

線條保證按日期/時間排序嗎? – Sorpigal 2012-07-09 14:59:03

+0

@Sorpigal:是按日期/時間排序。實際上,我展示的文件只是'/ var/log/mpd.log'的縮短版本。 – ronnie 2012-07-09 15:03:10

+0

我認爲grep可能會更合適,如果你想獲得日期 – DrinkJavaCodeJava 2012-07-09 15:05:44

回答

3

對於有序輸入,

command | sed -n '/^Jul 07/,/^Jul 09/p' inputFile 

是足夠的。

+0

@ronnie:你是否加了'-n'選項? – 2012-07-09 15:05:14

1

你八九不離十,你要的是這樣的:

zgrep added new.txt | sed -n -e '/Jul 09/,/Jul 07/p' 

變化:

  • 添加-n,這意味着行不會被打印出來,除非你專門用p
  • 新增-e,只是爲了清晰起見
  • 刪除了你的雙引號字符串。這些不是必需的,因爲表達式已經用單引號括起來了,雙引號不會出現在文件中。

請注意,這和你的版本只有在行首總是按日期/時間排序時纔有效。

+0

您的解決方案可以正常工作,但它只顯示日期爲「jul 09」的條目,並且不會顯示「jul 07」中的條目。 – ronnie 2012-07-09 15:08:42

+1

@dennis提到我們需要按照它們在文件中出現的順序來指定範圍分隔符(7月7日和7月9日)。 – ronnie 2012-07-09 15:14:04