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脚本?
一种适度丑陋的方法是
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。
这个简单的 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)