【问题标题】:How to grep a term from S3 and output object name如何从 S3 中提取一个术语并输出对象名称
【发布时间】:2017-07-31 03:56:42
【问题描述】:

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

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

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

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

我想要的输出是

file.csv

最终,我需要在整个存储桶上迭代它,然后是所有存储桶,以获得

file1.csv
file2.csv
file3.csv

但我需要先克服这个障碍。 谢谢!

【问题讨论】:

    标签: bash amazon-s3 grep command-line-interface aws-cli


    【解决方案1】:

    因为您在 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),如果找到至少一个匹配项,它将返回 true,否则返回 false;然后就可以打印文件名了。

    编辑:解释

    1. while 循环将遍历files_list.txt 的每一行
    2. aws 命令将在stdout 中打印此文件
    3. 我们在安静模式 (-q) 下将 stdout 重定向到 grep,它充当模式匹配器,如果找到匹配则返回 true,否则返回 false。
    4. 如果 grep 返回 true,我们会将文件名 (${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和2相同,那么:

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

    【讨论】:

    • 谢谢。你能解释一下为什么每个元素都能让它起作用吗?
    • 完成,希望我的解释对您有所帮助!我还添加了我最近使用sed 学到的另一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2017-07-26
    • 2013-10-16
    • 2021-01-22
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    相关资源
    最近更新 更多