我在云实例上托管了多个文档。我想将符合特定模式的所有单词提取到.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
图案可以在线条的任何位置。
答案 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\}
指定应该有三位数。.*
,因为这会匹配很多其他事情。