【问题标题】:Tail script to write out contents of a file from the end up to a matched pattern尾部脚本,用于将文件的内容从结尾写出到匹配的模式
【发布时间】:2013-05-13 14:53:37
【问题描述】:

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

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

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

【问题讨论】:

  • 所以想要颠倒的顺序?文件中的最后一行应该作为第一行,依此类推直到模式?或者只是想打印从模式的最后一次出现到文件末尾的文件内容?
  • 是的,在您的描述中是后者。 (不倒序)。

标签: bash sh tail


【解决方案1】:

改用这个:

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

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

【讨论】:

  • 啊..你可能是对的?为什么我在这里需要尾巴?呃……让我试试这个。谢谢。
  • 这在一个简单的案例中起作用;但是当我尝试使用多个模式的另一个时,它给了我一个意想不到的结果......需要它写出来,直到模式第一次出现。
【解决方案2】:

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

示例将使用下一个“日志文件”

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

【讨论】:

  • 感谢 jm666 ..找到满足我要求的单行答案(我在下面发布)..是的,我想从第一次出现的模式中提取到文件末尾并将其写入另一个文件,比如说..
  • @squashed.bugaboo : sed -n '/pattern/,$p' &lt; log &gt;tmp 还不够单行吗? ;) :) 但可以肯定的是,awk 很酷 ;)
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多