使用grep识别模式

时间:2016-09-09 20:54:59

标签: linux grep

我在云实例上托管了多个文档。我想将符合特定模式的所有单词提取到.txt文件中。这是模式:

ABC123A
ABC123B
ABC765A

等等。基本上,单词以特定字符串开头,ABC'具有固定数量的数字,并以字母结尾。这是我的代码:

grep -oh ABC[0-9].*[a-zA-Z]$ > /home/user/abcLetterMatches.txt

当我执行查询时,它会运行几个小时而不会产生任何输出。我有1100多份文件。但是,当我运行此查询时:

grep -r ABC[0-9].*[a-zA-Z]$ > /home/user/abcLetterMatches.txt

带有字符串的文件列表会在几秒钟内生成。

在查询中需要更正哪些内容?是什么导致了延迟?

更新1

根据答案,很明显该命令缺少需要执行的文件名。我想在多个文档文件(> 1000)上运行代码

我想搜索的文档位于目录中的多个子目录中。搜索它们的好方法是什么?做

grep -roh ABC[0-9].*[a-zA-Z]$ > /home/user/abcLetterMatches.txt

仅返回文件名。

更新2

如果我使用以下答案中的更新代码:

find . -exec grep -oh "ABC[0-9].*[a-zA-Z]$" >> ~/abcLetterMatches.txt {} \; 

我收到no file or directory错误

更新3

图案可以在线条的任何位置。

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

~/  grep -E "^ABC[0-9]{3}[A-Z]$" docs > filename
ABC123A
ABC123B
ABC765A

答案 1 :(得分:1)

没有延迟,grep只是在等待您没有给出的输入(因此它默认等待标准输入)。您可以通过使用filename:

提供参数来更正命令
grep -oh "ABC[0-9].*[a-zA-Z]$" file.txt > /home/user/abcLetterMatches.txt 

来源(man grep):

SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]

要以递归方式对多个文件执行相同的grepping,请将其与find命令结合使用:

find . -exec grep -oh "ABC[0-9].*[a-zA-Z]$" >> ~/abcLetterMatches.txt {} \; 

答案 2 :(得分:0)

这就是你要求的:

grep -hr '^ABC[0-9]\{3\}[A-Za-z]$'
  • -h无法获取文件名。
  • -r以递归方式搜索 r 。如果没有给出目录(如上所述),则使用当前目录。否则只需指定一个作为最后一个参数。
  • 围绕模式引用以避免偶然发生错误等等。
  • 模式开头的
  • ^ - 与最后的$一起 - 仅匹配整行。 (不确定这是否是一项要求,但样本数据表明了这一点。)
  • \{3\}指定应该有三位数。
  • 没有.*,因为这会匹配很多其他事情。