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