我正在为this tail question寻找一个简单变体的解决方案...希望有人知道解决方案。基本上我想tail
一个文件,直到字符串/模式匹配,然后从文件末尾写出内容直到包含该模式的行(或者直到该模式)。此 link处的解决方案,稍作修改即可将输出重定向到新文件:
sh -c 'tail -n +0 --pid=$$ -f tmp.log | { sed "/pattern/ q" && kill $$ ;}' >& tmp.txt
给了我完全相反的东西(包含从顶部到字符串/模式匹配的文件)。感谢任何想法 - 感谢您的时间。
答案 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
感谢所有评论/发帖的人。欣赏它。