编写Shell脚本扫描S3文件提取列头输出日志的实现方法
完整实现脚本
直接替换你现有的脚本框架即可,先修改脚本开头的配置项为你自己的实际参数:
#!/bin/bash # -------------------------- 配置项 按需修改 -------------------------- # 要扫描的目标S3文件夹路径,必须带s3://前缀,结尾加斜杠 S3_TARGET_PATH="s3://your-bucket-name/your/target/folder/" # 结果输出日志路径 LOG_FILE="my_s3_results.txt" # 要提取的文件头部行数,默认取第1行作为列头,需要取前3行就把值改成3 HEADER_FETCH_LINES=1 # ------------------------------------------------------------------- # 初始化日志文件 echo "Log File - " > "$LOG_FILE" date >> "$LOG_FILE" echo -e "\n=== 文件名与列头映射结果 ===" >> "$LOG_FILE" # 扫描S3路径下所有文件,过滤掉PRE开头的子目录项,提取文件名 aws s3 ls "$S3_TARGET_PATH" | grep -v "^PRE" | awk '{print $NF}' | while read -r file_name; do # 跳过空行/空文件名 [ -z "$file_name" ] && continue full_file_path="${S3_TARGET_PATH}${file_name}" echo "正在处理: $full_file_path" # 提取文件表头:注意原来的hdfs dfs -ls是列目录命令,读内容要用-cat,压缩文件换成-text即可 header_content=$(hdfs dfs -cat "$full_file_path" | head -n "$HEADER_FETCH_LINES") # 结果写入日志 echo "文件名: $file_name" >> "$LOG_FILE" echo "完整S3路径: $full_file_path" >> "$LOG_FILE" echo "列头内容: $header_content" >> "$LOG_FILE" echo "----------------------------------------" >> "$LOG_FILE" done echo "所有文件处理完成,结果已写入 $LOG_FILE"
关键注意点
- 脚本自动过滤了
aws s3 ls返回结果中PRE开头的子目录条目,不会误把文件夹当文件处理触发报错。 - 所有路径变量都加了双引号包裹,兼容带空格、特殊字符的文件名,不会出现执行异常。
- 如果你需要递归扫描目标文件夹下所有嵌套子目录的文件,给
aws s3 ls加上--recursive参数即可,注意此时要去掉S3_TARGET_PATH结尾的斜杠,避免路径拼接出错。 - 如果你的S3上存的是gzip、lzo等压缩格式的文本文件,把脚本里的
hdfs dfs -cat换成hdfs dfs -text即可,HDFS会自动解压读取内容。
运行步骤
- 把上述内容保存为
s3_scan.sh,替换你原来的脚本框架,修改开头的配置项为实际参数 - 给脚本添加可执行权限:
chmod +x s3_scan.sh - 直接执行脚本:
./s3_scan.sh - 执行完成后打开
my_s3_results.txt即可查看所有文件名和对应列头的关联结果
如果你本地配置了aws cli和hdfs客户端的对应访问权限,脚本可以直接运行,不需要额外调整其他逻辑。
内容的提问来源于stack exchange,提问作者Gdata0data0
相关产品推荐
相关产品推荐

