grep比赛中的字符


8

我正在寻找一个巨大的数据库转储中的查找和替换对象,并且它没有做我认为应该发生的事情。我想在文件中grep输入目标字符串,然后查看周围的8个字符左右(我可能需要调整该数字,具体取决于)。我怎样才能做到这一点?

我之所以不能打交道,是因为有数百场比赛,甚至数千场比赛。我想获得一些围绕字符串的字符,然后将其通过管道uniq传递到或某种东西中,以查看为什么我的查找和替换有意外行为。

另外,同一行上可以有多个匹配项!


它不是文本文件吗?
enzotib

是的,但即使是比赛也太大了,无法引起关注。
2011年

Answers:


12

粗略的使用grep方式是

grep -o "....yourtext...." /path/to/the/dump.sql

点数对应于grepped文本之前/之后的字符数。该-o选项使grep输出仅匹配项,而不是整行。

uniq在输出上使用,请记住您必须首先对输出进行排序。所以通常,你会

grep . . . | sort | uniq

如果您对每次比赛的点击量感兴趣,则可以使用以下命令获得不错的输出

grep . . . | sort | uniq -c | sort -n

原油?完全复杂!
user394 2011年

1
您可以使用repeat运算符对此进行一些扩展:grep -o '.\{8\}yourtext.\{8\}'。这比计数8点少了一些令人头晕的事情。
卡勒布(Caleb)

:)简而言之,我的意思是您不会玩诸如计算匹配字符(使用范围)或缩小字符集之类的事情。
rozcietrzewiacz 2011年

@Caleb和user394:这正是我不建议的内容(因此被称为“粗略”方法)。除此以外,不需要记住重复运算符的构造-键入“ .....”比输入“。\ {6 \}”要快得多。
rozcietrzewiacz

7

从@rozcietrzewiacz的答案开始,我可以扩展为

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file

1
“原始”点序列一直看起来越来越好:)
Caleb

1
@Caleb:通常,“粗略”的答案是一个好的开始,但有时有人想对此做一点说明。
enzotib

1
点序列法不会找到左对齐或右对齐的目标模式。这种方法会。(+1)
Peter.O 2011年

2
PS ..我刚刚注意到,当第一个模式的结尾“ exta”文本的范围与前导“ extra”文本的范围重叠时,它不会在同一行上捕获模式的多个实例(如OP所述)下一个模式的变化
Peter.O 2011年

@fred:是的,-o当两个比赛重叠时,只给出第一个比赛:echo 'aaabbbccc' | grep -o 'bb
enzotib
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.