我想在匹配的模式之前和之后提取行。
例如:如果文件内容如下
absbasdakjkglksagjgj
sajlkgsgjlskjlasj
hello
lkgjkdsfjlkjsgklks
klgdsgklsdgkldskgdsg
我需要在'hello'
之前和之后找到你好和显示行输出应为
sajlkgsgjlskjlasj
hello
lkgjkdsfjlkjsgklks
这对GNU来说是可行的,但是我需要一个在AIX / KSH SHELL中没有安装GNU的方法。
答案 0 :(得分:1)
sed -n '/hello/{x;G;N;p;};h' filename
答案 1 :(得分:0)
我发现一次构建GNU coreutils通常不那么令人沮丧,并从更多功能中受益http://www.gnu.org/software/coreutils/
答案 2 :(得分:0)
由于您将在计算机上安装Perl,因此您可以使用以下代码,但您可能最好安装GNU实用程序。对于之前的行,此选项为-b n1
,对于匹配后的行,此选项为-f n1
。它适用于PCRE匹配(因此,如果您需要不区分大小写的匹配,请在正则表达式之后添加i
,而不是使用-i
选项。我没有实现-v
或{{1}我不需要那些。
-l
答案 3 :(得分:0)
我有一种情况,我在平板电脑上遇到了一个缓慢的telnet会话,信不信由你,我无法用键盘轻松编写Perl脚本。我想出了这个hacky操作,在AIX的有限grep中为我工作。如果你的grep返回数百行,这将无法正常工作,但如果你只需要一行和一行或两行以下,这可以做到。首先我跑了这个:
cat -n filename |grep criteria
通过包含-n
标志,我看到了我正在寻找的数据的行号,如下所示:
2543 my crucial data
由于cat
给出的行号前面有2个空格,后面有1个空格,我可以在它之前插入行号:
cat -n filename |grep " 2542 "
我跑了几次,给了我2542行和2544行预订了第2543行。就像我说的那样,它肯定是可以挽回的,就好像你有大量的数据可能有“2542”到处都是,但只是抓住几条快速线,它运作良好。