如何从 S3 中 grep 一个术语并输出对象名称

How to grep a term from S3 and output object name

我需要对 S3 中的数千个文件进行 grep 搜索,并在某个输出文件中列出这些文件名。我是使用 cli 的新手,所以我一直在本地和 s3 的一小部分中进行测试。

到目前为止我得到了这个:

aws s3 cp s3://mybucket/path/to/file.csv - | grep -iln searchterm > output.txt

问题在于连字符。由于我正在复制到标准输出,grep returns(标准输入)中的 -l 开关而不是 file.csv

我想要的输出是

file.csv

最终,我需要对整个桶进行迭代,然后对所有桶进行迭代,以获得

file1.csv
file2.csv
file3.csv

但我需要先跨过这个坎。 谢谢!

因为您在 STDOUT 中打印文件并将其通过管道传输到 grep STDIN,所以 grep 不知道原始文件是 file.csv。如果您有很长的文件列表,我会这样做:

while read -r file; do aws s3 cp s3://mybucket/path/to/${file} - | grep -q searchterm && { echo ${file} >> output.txt; }; done < files_list.txt

我无法尝试,因为我无权访问 AWS S3 实例,但诀窍是安静地使用 grep (-q),如果找到,它将 return 为真至少匹配,否则为假;然后就可以打印文件名了。

编辑:解释

  1. while 循环将遍历 files_list.txt
  2. 的每一行
  3. aws 命令将在 stdout
  4. 中打印此文件
  5. 我们在静默模式 (-q) 中将 stdout 重定向到 grep,它充当模式匹配器,return 如果找到匹配则为真,否则为假聪明
  6. 如果 grep return 为真,我们将文件名 (${file}) 附加到我们的输出文件。

EDIT2:其他解决方案

while read -r file; do aws s3 cp s3://mybucket/path/to/${file} - | sed -n /searchpattern/{F;q} >> output.txt; done < files_list.txt

说明

步骤一、二相同,则:

  1. stdout 被重定向到 sed,它将逐行查找文件,直到找到第一个 stream pattern,然后退出(q),打印文件名(F) 在输出文件中。