匹配之前和之后的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