2011-06-08 29 views
26

我已經看到一些前後格線的例子,但我想忽略中間線。 所以,我想先行五行,但沒有別的。 可以這樣做嗎?如何讓'grep'在grepped行之上顯示一行五行?

+0

問題還不清楚,是匹配前的第5行還是匹配前的第5行 – CharlesB 2011-06-08 16:14:29

+0

Dup of http://stackoverflow.com/questions/9081/grep-a-file-but-show-several-surrounding-行 – Vadzim 2014-07-15 13:33:26

+0

這個評論即將到來,但問問自己:一旦你確定了「參考線」和前五個「grep -B5」foo「文件」,是否有關於該行的診斷信息,除了它是5線之前?例如,你在尋找一個特定的錯誤,並希望返回進程ID?那麼也許'grep -B5「foo」file | grep「bar」'可能是最簡單的事情。 – 2016-01-19 01:13:17

回答

27

好吧,我認爲這會做你想要的。它會查找一個模式,並在每場比賽前提取第5行。

grep -B5 "pattern" filename | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }' 

基本上這是如何工作是需要的第一線,打印,然後等待,直到它看到^--$(通過使用grep的匹配分離器),並重新開始。

+0

完美!謝謝 – mike628 2011-06-08 16:54:55

+2

嘿克里斯,不是一個awk用戶,但我想更好地理解這一點。你能詳細解釋一下awk的一部分嗎?我在網上看了一大堆教程,其中一些我無法弄清楚。 – mike628 2011-06-09 13:09:45

+1

如果我要用awk解決這個問題,那麼執行'grep -B5「模式」filename |「可能會更直截了當。 awk'{mod = NR%7; if(mod == 1){print $ 0}}''。 7因爲1個匹配的行+ 5個上下文行+ 1個分隔符行。第一行輸出將是一個分隔符行,所以感興趣的行將是第7行,從第2行開始。 NR是awk自動給出的從零開始的行號。對於'-B',Thx爲 – 2016-01-19 01:32:45

9

這是選項-B

-B NUM, --before-context=NUM 
    Print NUM lines of leading context before matching lines. 
    Places a line containing -- between contiguous groups of 
    matches. 
+0

雖然不符合要求 - 它也顯示所有中間行。 – Cybergibbons 2015-06-11 10:25:44

4

如果你只是想有5日線在比賽之前,你可以這樣做:

grep -B 5 pattern file | head -1 

編輯:
如果你可以有多個比賽,你可以試試這個(用你的實際模式交換pattern):

sed -n '/pattern/!{H;x;s/^.*\n\(.*\n.*\n.*\n.*\n.*\)$/\1/;x};/pattern/{x;s/^\([^\n]*\).*$/\1/;p}' file 

我把這個從Sed tutorial,節:Keeping more than one line in the hold buffer,實施例2和適於它一下。

+0

這隻適用於第一場比賽,任何後續的比賽將被扔掉。 – 2011-06-08 15:43:37

+0

我添加了第二種方法 - 這次它也可以用於多個匹配。 – bmk 2011-06-08 16:04:18

1

這種方式對我來說更容易:

grep --no-group-separator -B5 "pattern" file | sed -n 1~5p 

這裏grep 5線及之前的模式,關閉---組分隔符,然後打印每5日線。

相關問題