2

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

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

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

4

3 回答 3

1

改用这个:

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

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

于 2013-05-13T15:17:44.220 回答
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

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

line2 bb
line3 cc
line4 bb
line5 ee
line6 bb
line7 gg
于 2013-05-13T15:45:11.487 回答
0

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

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

感谢所有评论/发布想法的人。欣赏它。

于 2013-05-13T15:53:10.180 回答