我们以此文件textfile.txt
:
foo
bar
foo
bar
foo**word1**bar
foo
bar**word2**foo
foo
foo
bar
foo**word1**bar
foo
foo
bar**word2**foo
foo
foo
bar
foo**word1**bar
foo
bar**word2**foo
foo
bar
foo**word1**bar
foo
bar
foo
bar
bar**word2**foo
foo
我要做的是:搜索文件中的第一个单词,此处单词为**word1**
,如果找到此单词,则搜索同一行,接下来的两个单词搜索第二个单词,这是**word2**
我尝试使用grep
搜索**word1**
,并使用-n
选项获取行号。然后使用此行号,使用sed
提取匹配的行和接下来的两行,然后执行其他grep
搜索**word2**
。它还应该每次**word1**
和**word2**
匹配。
但它并不觉得这是实现这一目标的最佳方式。
在这个示例中,应该有3个正面匹配:最后一个不起作用,因为**word2**
比**word1**
提前4行,我希望最多前面有2行。
关于awk的输出,我想输出两个单词匹配的行号,以及它们各自找到的行。
我还有一个返回输出的shell脚本。我想做的是:对于每个匹配的几个单词,打印"my_script_result" + "awk_result" > file
答案 0 :(得分:1)
awk '/word1/{ok=1}ok && /word2/{print NR,$0}' file
在上面的行中,/word1/
是您的第一个单词,/word2/
是您的第二个单词。输出将匹配行号和匹配的行。
它以这种方式运作:
脚本从文件开头读取行,找到word1
后,设置变量ok =1 (true)
。第二部分检查ok AND word2 matched
,如果满意,则打印输出。因此,如果在我们找到word2
之前匹配word1
,ok
为false
,则会跳过该行。
awk /word1/{ok=1;s=NR}ok && NR<=s+2 && /word2/{print NR,$0}' file
7 bar**word2**foo
20 bar**word2**foo
答案 1 :(得分:0)
从标记工具中选择grep:
echo shelloutput && grep -nA2 "word1" EgrepToy.txt | egrep "word2"
输出:
shelloutput
7-bar**word2**foo
20-bar**word2**foo
因为我不确定我是否理解并且#34;在这个例子中,应该有3个正面匹配&#34; (我认为OP和我在某种程度上计算&#34;下一行&#34;不同),我添加一个替代方案来获得三个:
echo shelloutput && grep -nA3 "word1" EgrepToy.txt | egrep "word2"
输出:
shelloutput
7-bar**word2**foo
14-bar**word2**foo
20-bar**word2**foo
两种解决方案基本相同:
echo shelloutput
&&
egrep word1
-A2
-n
| egrep word2
回显shelloutput是您想要做的任何事情的占位符。
答案 2 :(得分:0)
从标记工具中选择sed:
echo shelloutput && sed -En "/word1/{/word2/{=;p;};N;/word2/{=;p;};N;s/^.*\n//;/word2/{=;p;};N;s/^.*\n//;/word2/{=;p;}}" EgrepToy.txt
输出:
shelloutput
7
bar**word2**foo
14
bar**word2**foo
20
bar**word2**foo
像这样工作:
echo shelloutput
&&
/word1/{
/word2/{
=;p;};
N;
s/^.*\n//;
/word2/{
=;
p;
如果你想要两个匹配,即只扫描两个跟随行的word2,那么只需重复一次,只需删除一个N;s/^.*\n//;/word2/{=;p;};
。