使用这个:
grep -A1 -B1 "test_pattern" file
将在文件中匹配的模式之前和之后产生一行。有没有办法不显示行而是显示指定数量的字符?
我文件中的行非常大,所以我对打印整行不感兴趣,而只是在上下文中观察匹配。关于如何做到这一点的任何建议?
前 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 使用扩展的正则表达式。确保在你的表达式周围加上引号,否则它可能会被 shell 解释。
{0,255}
有效 {0,256}
给出 grep: invalid repetition count(s)
你可以使用
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\}
表示法类似于 *
,但指定了 0 到 20 次重复而不是 0 次或多次。-o
表示只显示匹配项本身,而不是整行。
grep: Invalid content of \{\}
我永远不会轻易记住这些神秘的命令修饰符,所以我把 top answer 变成了我的 ~/.bashrc
文件中的一个函数:
cgrep() {
# For files that are arrays 10's of thousands of characters print.
# Use cpgrep to print 30 characters before and after search pattern.
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
无法找到您要查找的内容。
请注意您可以调用与 grep
方法平行的 cgrep
的两种不同方式。
有一种创建函数的“niftier”方式,其中“$2”仅在设置时传递,这将节省 4 行代码。不过我手边没有。 ${parm2} $parm2
之类的东西。如果我找到它,我会修改函数和这个答案。
使用 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
以下将在 pattern 之前打印一个单词,然后是实际单词,然后在 pattern 之后打印一个单词:
echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)( there )(\w+)/'
hey there how
您可以使用正则表达式 grep 查找 + 第二个 grep 突出显示
echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' | grep string
23_string_and
https://i.stack.imgur.com/sXXcZ.png
使用 ugrep,您可以使用选项 -o
(--only-matching
) 指定 -ABC
上下文,以在匹配之前和/或之后使用上下文的额外字符显示匹配,以匹配匹配和指定 -ABC
中的上下文宽度。例如:
ugrep -o -C30 pattern testfile.txt
给出:
1: ... long line with an example pattern to match. The line could...
2: ...nother example line with a pattern.
https://i.stack.imgur.com/hmWn9.png
brew install homebrew/dupes/grep
安装并将其作为ggrep
运行。