从文件读取grep模式


49

我有几个大的文本文件,并且在文件中,UNIQS.txt我有grep从另一个文件来的字符串列表。我使用的代码是

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

什么都不做-生成的文件为空。但是当我这样做

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

它正常工作。这让我感到困惑,因为我不认为grep会将条目解释UNIQS.txt为不带引号和斜杠的正则表达式模式,以此类推(例如没有)。一般情况下,如果从文件中获取模式,它将自动认为它们是regexp模式?

编辑:UNIQS.txt文件中,有换行符分隔的形式的字符串

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(称为模板名称)和文件EEP_VSL...选项卡分隔的列,大约有14列,第一列是模板名称,因此基本上我想提取与文件中每个模板相对应的行。

Answers:


60

-f选项指定grep读取模式的文件。这就像在命令行上传递模式(-e如果有多个选项,则可以选择),只是从shell调用时,您可能需要引用模式以保护其中的特殊字符不被shell扩展。

参数-Eor -F-P(如果有的话)告诉grep模式写入哪种语法。不带参数的grep需要基本的正则表达式;与-E,grep期望扩展的正则表达式 ; 使用-P(如果支持),grep期望Perl正则表达式;和一起-F,grep需要文字字符串。模式是来自命令行还是来自文件都没有关系。

请注意,这些字符串是子字符串:如果您a+b以模式传递,a+b+c则匹配包含的行。如果要搜索仅包含提供的字符串之一且不包含更多字符串的行,请传递该-x选项。


1
好的,谢谢。我可以问一下,假设我想完全匹配该字符串,即,如果字符串是12345,那么我只希望它与12345匹配,而不是123456或123455等,我该怎么做?
sdf 2013年

2
@sdf阅读我的最后一段:-x
别再作恶了'

这太旧了,很抱歉将其挖掘出来。尽管上面的解释很棒,但是对于为什么没有-F标记的情况下文件中的模式(字符串)为何不匹配却有些含糊。我的猜测是-上面的示例行中的导致将其读取为字符序列吗?那也不需要方括号吗?我已经测试了一些示例文件,但还没有得出结论。
trs

@trs问题中显示的行(在我发布答案后添加了该行)不包含在正则表达式中具有特殊含义的任何字符,因此使用和不使用时,其行为相同-F。它将与诸如之类的字符有所不同\[*^$
吉尔斯(Gilles)“所以别再作恶了”

@Gilles谢谢,这也是我的印象,但是@sdf声称“生成的文件为空”(读取:无匹配项)而没有-F标志?
trs

0

我遇到了同样的错误,但@gilles给出的好答案无法解决。在输入文件中仔细查看时,我在末尾发现了2个换行符。没有这些,仅需成功:grep -i file_pattern_input文件

(GNU grep 3.1,输入文件超过5000条记录,匹配​​/模式文件2536,我知道所有2536都必须在文件中。换行符可以获取文件的所有行,而不仅仅是2536个匹配行)


1
这与OP的问题无关。空行被grep读取为空模式,并且空模式匹配到处。
老师
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.