Linux 使用grep识别模式

Linux 使用grep识别模式,linux,grep,Linux,Grep,我有几个文档托管在一个云实例上。我想将符合特定模式的所有单词提取到.txt文件中。这是一种模式: ABC123A ABC123B ABC765A 还有一个。从本质上讲,这些词以特定的字符串“ABC”开头,有固定数量的数字,以字母结尾。这是我的代码: grep -oh ABC[0-9].*[a-zA-Z]$ > /home/user/abcLetterMatches.txt 当我执行查询时,它会运行几个小时而不生成任何输出。我有1100多份文件。但是,当我运行此查询时: grep -r

我有几个文档托管在一个云实例上。我想将符合特定模式的所有单词提取到
.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 {} \; 
我得到一个
无文件或目录的错误

更新3


图案可以是线条中的任意位置

您可以使用此regexp:

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

您可以使用此regexp:

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

没有延迟,
grep
只是等待您没有提供的输入(因此默认情况下,它会等待标准输入)。您可以通过提供带有文件名的参数来更正命令:

grep -oh "ABC[0-9].*[a-zA-Z]$" file.txt > /home/user/abcLetterMatches.txt 
来源(
mangrep
):

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

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

没有延迟,
grep
只是等待您没有提供的输入(因此默认情况下,它会等待标准输入)。您可以通过提供带有文件名的参数来更正命令:

grep -oh "ABC[0-9].*[a-zA-Z]$" file.txt > /home/user/abcLetterMatches.txt 
来源(
mangrep
):

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

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

这符合您的要求:

grep -hr '^ABC[0-9]\{3\}[A-Za-z]$'
  • -h
    以不获取文件名
  • -r
    以全局搜索r。如果没有给出目录(如上所述),则使用当前目录。否则,只需指定一个作为最后一个参数
  • 在模式周围加引号,以避免意外的全球化等
  • 模式开头的
    ^
    与结尾的
    $
    仅匹配整行。(不确定这是否是一项要求,但样本数据表明了这一点。)
  • \{3\}
    指定应该有三位数字
  • 没有
*,因为这会匹配很多其他东西
    这满足了您的要求:

    grep -hr '^ABC[0-9]\{3\}[A-Za-z]$'
    
    • -h
      以不获取文件名
    • -r
      以全局搜索r。如果没有给出目录(如上所述),则使用当前目录。否则,只需指定一个作为最后一个参数
    • 在模式周围加引号,以避免意外的全球化等
    • 模式开头的
      ^
      与结尾的
      $
      仅匹配整行。(不确定这是否是一项要求,但样本数据表明了这一点。)
    • \{3\}
      指定应该有三位数字
    • 没有*,因为这会匹配很多其他东西


    “运行数小时而不产生任何输出”,这是因为它正在等待输入。你没有告诉grep去哪里看,所以它在读STDIN。您需要执行
    grep
    。您的模式将匹配与示例不同的内容,例如
    ABC1fooA
    。您的模式只需要在
    ABC
    之后加一个位数,然后再加上任何内容即可。您的模式将从
    356XYZABC123A
    等模式中提取
    ABC123A
    。这是有意的吗?“运行数小时而不产生任何输出”,这是因为它正在等待输入。你没有告诉grep去哪里看,所以它在读STDIN。您需要执行
    grep
    。您的模式将匹配与示例不同的内容,例如
    ABC1fooA
    。您的模式只需要在
    ABC
    之后加一个位数,然后再加上任何内容即可。您的模式将从
    356XYZABC123A
    等模式中提取
    ABC123A
    。这是故意的吗?把图案用引号括起来。@Barmar,刚刚做到了。我明白了。我想在一堆包含文档的目录上运行该命令。考虑到单个文件的数量如此之多,按单个文件进行检查是不可行的。我正在编辑问题以包含此信息。@kurious我已将其添加到我的答案中。我尝试了-roh。它写的是文件名,而不是确切的匹配项。用引号标出模式。@Barmar,就这么做了。我明白了。我想在一堆包含文档的目录上运行该命令。考虑到单个文件的数量如此之多,按单个文件进行检查是不可行的。我正在编辑问题以包含此信息。@kurious我已将其添加到我的答案中。我尝试了-roh。它写入文件名,而不是精确匹配。它将匹配包含您的模式的所有内容,如
    XYZABC123A2356fghf65
    。将匹配包含您的模式的所有内容,如
    XYZABC123A2356fghf65
    。模式可以位于行中的任何位置。相应地更新了问题。如果你能相应地编辑你的答案,那就太好了。这个模式可以是行中的任何地方。相应地更新了问题。如果你能相应地编辑你的答案,那就太好了。