获取文件从某个任意字符串的第一个实例到最后一个实例的内容

获取文件从某个任意字符串的第一个实例到最后一个实例的内容

less如何从任意字符串“foo”的第一个实例到最后一个实例查看?

这个任意字符串将出现在日志的几乎每一行上。我不想这样做,grep "foo" bar.log | less因为它不会出现在相关的每一行上。

假设该文件是

1 Random junk I don't want to see
2 Care about (foo)
3 Care about (foo)
4 Care about
5 Care about (foo)
6 Other random junk I don't want to see

不幸的是,我想忽略的行不遵循良好的模式,否则我可以只使用grep -v 'insert pattern here'.

我想知道如何以less某种方式将以下内容纳入其中,

2 Care about (foo)
3 Care about (foo)
4 Care about
5 Care about (foo)

grep "foo" bar.log | less不起作用,因为它忽略了我关心的第 4 行。

答案1

如果你有awk你可以这样做:

awk '/foo/{print b$0;b="";x=1;next} x{b=b$0"\n"}' bar.log | less

当 afoo出现时,它打印缓冲区(b变量)和当前行,并清除缓冲区。

否则,但仅当foo已经出现(x变量)时,它才会缓冲当前行。

答案2

这需要一些仔细的 shell 引用,但是你可以ed为此,请使用可编写脚本的编辑器:

printf '%s\n' "/foo/ka" "??" "'a,.w "'!less' q | ed -s file

这将发送四个命令到ed

  1. /foo/ka-- 搜索(从文件开头)模式 foo;在第一场比赛中,设置一个名为 的标记a
  2. ??-- 重复搜索,但向后,环绕文件末尾;这里重要的副产品是它将当前行设置为该(最后一个)匹配。
  3. 'a,.w !lessa-- 从通过当前行 ( )命名的标记.,将这些行写入 shell 命令 ( !) less
  4. q——退出编辑。

您需要less优雅地退出 ( q) 才能ed退出。此解决方案假设该模式在文件中至少存在一次,否则搜索将失败,并且在退出?之前您将得到 3 。ed

答案3

您是否希望使用 grep 来排除匹配行,而不是包含它们?如果是这样,请尝试:grep -v "Don't care about"

相关内容