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)