grep 的 -A -B -C 开关(在前后打印几行)有什么替代方法吗?

Pra*_*ate 10 grep awk perl text-processing

grep -A 2 -B 3 
Run Code Online (Sandbox Code Playgroud)

在 grep 字符串之后打印 2 行并在之前打印 3 行。

grep -C 3
Run Code Online (Sandbox Code Playgroud)

打印前 3 行和后 3 行

不幸的是,grep我使用的不支持这些选项。是否有任何替代命令或脚本可用于模拟这一点?使用sed/ awk/ perl/ shell脚本?

gee*_*aur 6

一种适度丑陋的方法是

grep -v pattern file >file.tmp; diff -c file.tmp file
Run Code Online (Sandbox Code Playgroud)

或替换-c-C NUM用于NUM上下文的行。不过,它会产生额外的输出。(如果你diff支持-u/ -U NUM,它会更干净。)

如果您diff没有-c/ -C/ -u,还是有办法做到这一点,但他们很丑陋。另一方面,一个diff甚至不支持的系统也-c可能没有 Perl。


Vij*_*ant 5

这个简单的 perl 脚本grep -A在某种程度上模拟了

#!/usr/bin/perl

$pattern=shift; #patthern to search
$lines=shift; # number of lines to print

$n = 0;
while (<>) {
  $n = $lines if /$pattern/; # reset counting
  if ($n) { print; $n-- } # print if within
  $n = 0 if eof; # don't leak across file boundaries
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以添加使用说明,以使脚本可读和可用;)

USAGE:    $./grep-A.pl <pattern> <numLines> <filename> 
Run Code Online (Sandbox Code Playgroud)


cjm*_*cjm 5

ACK只需要Perl和包括-A-B-C选项的工作如grep的。它使用 Perl 的 regex 语法而不是 grep 的,并且它选择要搜索的文件的方式完全不同。您可能想-f在使用它时尝试该选项(它会打印出它将搜索的文件,而无需实际搜索任何内容)。

它可以作为不需要非核心模块的单个脚本安装。只需将其放入您的~/bin目录(或您具有写访问权限的 PATH 上的任何其他位置)并确保它是chmod可执行的。