2013-05-13 78 views
2

我正在尋找一個解決方案,以一個易於變種的this tail question ...希望有人會知道解決方案。基本上我想tail一個文件,直到一個字符串/模式匹配,然後從文件的末尾寫出內容直到包含該模式的行(或直到該模式)。在這個 link的解決方案,有輕微的修改,重新直接輸出到一個新的文件:尾部腳本從最後寫出文件的內容到匹配的模式

sh -c 'tail -n +0 --pid=$$ -f tmp.log | { sed "/pattern/ q" && kill $$ ;}' >& tmp.txt 

給我的完全相反(包含從頂部高達字符串/模式匹配的文件)。欣賞任何想法 - 感謝您的時間。

+0

所以需要反向順序的行嗎?文件中的最後一行應該按照第一種方式進行,直到該模式?或者只是想要從文件的最後一次出現到文件結束時打印文件的內容? – jm666 2013-05-13 15:17:30

+0

是的,後者在你的描述中。 (不要顛倒順序)。 – 2013-05-13 15:19:45

回答

0

好的......我想,在環顧四周後,我發現我認爲是解決我的問題的方法。在途中改變問題的定義的道歉(模式的多次出現)。這裏是使用awk的修復:

awk '/pattern/{i++}i' tmp.log >& tmp.txt 

感謝所有評論/貼出想法的人。欣賞它。

1

使用這個代替:

sed -n '/pattern/,// p' >tmp.txt <tmp.log 

看起來你不想爲tail-f標誌,因爲那不停地嘗試讀取文件末尾(如果別人追加到文件) 。當你找到pattern時,需要照顧需要殺死tail,事實上它消除了完全使用tail的需要。

+0

啊..你可能是對的?爲什麼我需要在這裏尾巴?杜......讓我試試這個。謝謝。 – 2013-05-13 15:21:14

+0

這在一個簡單的情況下工作;但是當我在另一個模式中嘗試多個模式時,它給了我一個意想不到的結果......需要它寫出直到模式的第一次出現。 – 2013-05-13 15:41:10

1

因爲我不清楚你想打印的地方,例如從模式的第一次出現或最後一次 - 這裏是兩者的解決方案。

對於例如將使用下一個「日誌文件」

line1 aa 
line2 bb 
line3 cc 
line4 bb 
line5 ee 
line6 bb 
line7 gg 

,將搜索模式bb

#!/bin/bash 
PATTERN="bb" 
LOGFILE="/tmp/logfile" 
tail -r "$LOGFILE" | sed -n '1,/bb/p' | tail -r 

將打印出從bb最後一次出現排隊文件

line6 bb 
line7 gg 

的端部的

#!/bin/bash 
PATTERN="bb" 
LOGFILE="/tmp/logfile" 
sed -n "/$PATTERN/,\$p" < $LOGFILE 

將打印出 - 從該圖案的第一occurence直到文件末尾

line2 bb 
line3 cc 
line4 bb 
line5 ee 
line6 bb 
line7 gg 
+0

謝謝jm666 ..找到一個符合我的要求的單行答案(我在下面發佈)..我想從文件的第一次出現提取文件結尾並將其寫入另一個文件,比如.. – 2013-05-13 16:16:37

+1

@squashed。bugaboo:'sed -n'/ pattern /,$ p'< log > tmp'是不是足夠oneliner? ;):)但是,當然,awk很酷;) – jm666 2013-05-13 16:21:29

相關問題