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
:
/foo/ka
-- 搜索(从文件开头)模式 foo;在第一场比赛中,设置一个名为 的标记a
。??
-- 重复搜索,但向后,环绕文件末尾;这里重要的副产品是它将当前行设置为该(最后一个)匹配。'a,.w !less
a
-- 从通过当前行 ( )命名的标记.
,将这些行写入 shell 命令 (!
)less
。q
——退出编辑。
您需要less
优雅地退出 ( q
) 才能ed
退出。此解决方案假设该模式在文件中至少存在一次,否则搜索将失败,并且在退出?
之前您将得到 3 。ed
答案3
您是否希望使用 grep 来排除匹配行,而不是包含它们?如果是这样,请尝试:grep -v "Don't care about"