将文件用作源文件时修改grep搜索

时间:2019-06-11 14:31:15

标签: bash grep

当查询源是文件时,尝试使用grep输出字符串前的20个字符

问题的背景:我的文件包含许多长行文本,并且我试图在该文件中搜索字符串,并在感兴趣的字符串之前输出20个字符。为此,我使用以下参数grep -E -o ".{0,20}string",当我尝试任何给定的字符串时,该参数将起作用并给出正确的输出。

我现在面临的问题是尝试将其与grep中的-f选项结合使用,因为我有许多查询包含在不同的文件中。

我找不到将。{0,20}修饰符添加到文本文件中包含的每个查询的正确方法。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

输入示例(input.txt):

ezfnzjnefnzefnz
ezenfjznefnkz123hello
enzjfzeknzkabcworld
fzebkfzbejkfbzk

模式文件示例(pattern.txt):

hello
world

命令:

grep -Eo -f <(sed 's/^/.{0,3}/' pattern.txt) input.txt 

输出:

123hello
abcworld

Sed命令仅在每个模式的开头添加.{0,3}。当然,您可以使用其他方法来更新病毒码文件。

答案 1 :(得分:0)

请您尝试以下操作,仅对显示的示例进行测试。

awk 'FNR==NR{a[$0];next} {for(i in a){if(index($0,i)){val=index($0,i);print substr($0,val-3)}}}'  pattern.txt input.txt

现在添加上述解决方案的非一个内衬形式。

awk '
FNR==NR{
  a[$0]
  next
}
{
  for(i in a){
     if(index($0,i)){
       val=index($0,i)
       print substr($0,val-3)
     }
  }
}
'  pattern.txt input.txt