【问题标题】:wc -l against all files within an S3 bucketwc -l 针对 S3 存储桶中的所有文件
【发布时间】:2018-09-11 21:53:45
【问题描述】:

我有一个指向包含许多文件的 s3 存储桶的路径。使用aws-cli,是否有一个命令可以让我读取所有文件和| wc -l 针对输出?我正在尝试计算 s3 存储桶中所有文件的所有行

【问题讨论】:

  • 请记住,“wc”需要读取文件以计算其内容,例如该文件需要下载。
  • 不是必须的,不用下载也可以输出文件。示例:aws s3 cp "$FILENAME" -

标签: amazon-web-services amazon-s3 aws-cli


【解决方案1】:

将列表递归到桶中,并运行复制命令到stdout。这有助于文件没有下载到机器上。

您可以按照以下命令为我工作:

aws s3 ls --recursive s3://bucket-name/ | while read FILENAME; do
 echo "$FILENAME"
 if [ "$(aws s3 cp "$FILENAME" - | wc -l)" -eq 0 ]; then
  echo "0"
 else
  aws s3 cp "$FILENAME" - | wc -l
 fi
done | paste -d, - -

输出:

s3://bucket-name/a.txt,343
s3://bucket-name/b.txt,0

如果您尝试获取 AWS 中压缩文件的数量,请像这样使用“zcat”:aws s3 cp "$FILENAME" - |猫猫 | wc -l

【讨论】:

    【解决方案2】:

    您可以从列出所有 S3 存储桶开始 -

    aws s3 ls
    

    要列出特定存储桶中的对象,请尝试 -

    aws s3 ls s3://mybucket
    

    要回答你的问题,你可以这样做 -

    aws s3 cp s3://mybucket/myfile.txt - | wc -l
    

    有关更多 awscli S3 命令,请查看此link

    【讨论】:

    • 您的命令只会计算文件的数量,而不是文件中的行数、单词数、字符数等。
    【解决方案3】:

    同Linux命令,列出s3目录下的文件,使用wc -l逐行统计

    aws s3 ls s3://bucket-name/ | wc -l
    

    【讨论】:

      【解决方案4】:

      或者,您可以使用S3 Select 使用 Python/boto3 计算 Parquet/CSV/gzip/bzip2 文件中的行数。

      sql_stmt    = """SELECT count(*) FROM s3object S"""   
      req_fact =s3.select_object_content( 
          Bucket  = bucket_name, 
          Key     = s3_key, 
          ExpressionType  = 'SQL', 
          Expression      = sql_stmt, 
          InputSerialization={'Parquet': {}}, 
          OutputSerialization = {'CSV': { 
                      'RecordDelimiter': os.linesep, 
                      'FieldDelimiter': colsep}}, 
           
      ) 
      

      请注意,您只能将其应用于 Parquet 和 CSV 文件,并且不适用于原始的非结构化日志。 查看async counter 获取完整的 Python 示例。

      【讨论】:

        猜你喜欢
        • 2017-05-25
        • 2023-03-22
        • 2011-03-23
        • 2015-11-02
        • 1970-01-01
        • 2015-10-23
        • 2020-05-29
        • 1970-01-01
        • 2022-11-03
        相关资源
        最近更新 更多