尾部脚本,用于将文件的内容从最终写入匹配的模式

时间:2013-05-13 14:53:38

标签: bash sh tail

我正在为this tail question寻找一个简单变体的解决方案...希望有人知道解决方案。基本上我想tail一个文件,直到字符串/模式匹配,然后从文件末尾写出内容直到包含该模式的行(或者直到该模式)。此 link处的解决方案,稍作修改即可将输出重定向到新文件:

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

给了我完全相反的东西(包含从顶部到字符串/模式匹配的文件)。感谢任何想法 - 感谢您的时间。

3 个答案:

答案 0 :(得分:1)

请改用:

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

看起来你不想要-f的{​​{1}}标志,因为它一直试图读取超过文件的末尾(以防其他人附加到文件)。当你找到tail时,这需要杀死tail,实际上它不需要完全使用pattern

答案 1 :(得分:1)

因为我不清楚您想要打印的位置,例如从第一次出现的模式或最后一次 - 这是两者的解决方案。

该示例将使用下一个“logfile”

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

将打印出来 - 从第一次出现的模式到文件末尾

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

答案 2 :(得分:0)

好的......我想在环顾四周后,我发现了我认为解决问题的方法。抱歉在中途改变问题的定义(多次出现模式)。这是使用awk的修复:

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

感谢所有评论/发帖的人。欣赏它。