Answers:
前3个字符,后4个字符
$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
brew install homebrew/dupes/grep
并以方式运行ggrep
。
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt
图案前后最多可以匹配5个字符。-o开关告诉grep仅显示匹配项,-E则使用扩展的正则表达式。确保在表达式周围加上引号,否则外壳可能会解释它。
{0,255}
可以{0,256}
给出grep: invalid repetition count(s)
您的意思是这样的:
grep -o '.\{0,20\}test_pattern.\{0,20\}' file
?
最多可在的两边打印20个字符test_pattern
。该\{0,20\}
标记是一样*
的,但指定零到二十重复,而不是零或more.The -o
说,只显示了比赛本身,而不是整条生产线。
grep: Invalid content of \{\}
使用gawk
,您可以使用匹配功能:
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
,则可以使用更灵活的解决方案:以下命令将在模式之前打印三个字符,然后输出实际模式,然后在模式之后打印5个字符。
echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/'
ey there how
这也可以应用于单词而不只是字符。以下将在实际匹配的字符串之前打印一个单词。
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
我永远不会轻易记住这些神秘的命令修饰符,因此我选择了最重要的答案并将其转换为~/.bashrc
文件中的函数:
cgrep() {
# For files that are arrays 10's of thousands of characters print.
# Use cpgrep to print 30 characters before and after search patttern.
if [ $# -eq 2 ] ; then
# Format was 'cgrep "search string" /path/to/filename'
grep -o -P ".{0,30}$1.{0,30}" "$2"
else
# Format was 'cat /path/to/filename | cgrep "search string"
grep -o -P ".{0,30}$1.{0,30}"
fi
} # cgrep()
这是实际的样子:
$ ll /tmp/rick/scp.Mf7UdS/Mf7UdS.Source
-rw-r--r-- 1 rick rick 25780 Jul 3 19:05 /tmp/rick/scp.Mf7UdS/Mf7UdS.Source
$ cat /tmp/rick/scp.Mf7UdS/Mf7UdS.Source | cgrep "Link to iconic"
1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri
$ cgrep "Link to iconic" /tmp/rick/scp.Mf7UdS/Mf7UdS.Source
1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri
有问题的文件是一个连续的25K行,使用常规找不到希望的文件grep
。
请注意,可以使用两种不同的方式来调用cgrep
该parallels grep
方法。
有一种创建函数的“更聪明”的方法,其中仅在设置时传递“ $ 2”,这将节省4行代码。我没有方便。有点像${parm2} $parm2
。如果找到它,我将修改功能和此答案。