匹配之前和之后的Grep字符?

使用这个:

grep -A1 -B1 "test_pattern" file 

会在文件中匹配的模式之前和之后产生一行。 有没有办法显示不是行而是指定数量的字符?

我的文件中的行很大,所以我不打印整行,而只是在上下文中观察匹配。 任何build议如何做到这一点?

之前3个字符和之后4个字符

 $> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' 23_string_and 
 grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

这将匹配您的模式之前和之后最多5个字符。 -o开关告诉grep只显示匹配,-E使用扩展的正则expression式。 确保将引号放在expression式中,否则可能会被shell解释。

你可以使用

 awk '/test_pattern/ { match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20); }' file 

你的意思是,像这样:

 grep -o '.\{0,20\}test_pattern.\{0,20\}' file 

这将在test_pattern两侧打印最多20个字符。 \{0,20\}符号类似于* ,但是指定了零到二十个重复,而不是零或更多。-o表示只显示匹配本身,而不是整个行。

gawk ,你可以使用匹配function:

  x="hey there how are you" echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}' ere are 

如果你可以用perl ,更灵活的解决scheme:下面将打印三个字符之前的模式,然后是实际的模式,然后5个字符之后的模式。

 echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/' ey there how 

这也可以应用于单词而不仅仅是字符。以后会在实际匹配的string之前打印一个单词。

 echo hey there how are you |perl -lne 'print $1 if /(\w+) there/' hey 

以下将打印一个字后的模式:

 echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/' how 

以下将在模式之前打印一个单词,然后是实际单词,然后是模式之后的一个单词:

 echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)( there )(\w+)/' hey there how