postgresql Async命令和AWK用于在AWS S3中更改文件

kuuvgm7e  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(2)|浏览(148)

我想重命名我在AWS S3存储桶中的pdf文件,将它们的名称从我们使用的某种数字更改为PostgreSQL表中的UUID。
目前,我正在尝试这样做:

export PGPASSWORD="<my_password>"

echo "SELECT id, number FROM mytable"                    \
  | psql -h <local-docker-ip> -p <docker-port> -U <user> \
  | head -n -2                                           \ # this is only for eliminating extra text
  | awk 'NR > 2 { aws s3 --profile Admin-Profile mv "s3://<bucket>/documents/" $3 ".pdf" " " "s3://<bucket>/documents/" $1 ".pdf" }'

我在awk中使用的字符串连接可能是错误的,但我不知道如何解决它。当然,如果有人知道更好的方法,我愿意接受建议。

zpjtge22

zpjtge221#

awk中,实际上有一种方法可以使用system()函数或通过管道传输到系统命令中的print语句来执行shell命令,这实际上可以用于直接执行AWS CLI命令。但是,在我们继续之前,重要的是要了解在awk中使用system()或管道将为每个命令创建一个新的shell,如果您正在处理大量数据,则会显着较慢并消耗更多资源。这就是为什么生成脚本然后运行它通常更有效的原因。如果你仍然对这种方法感兴趣,你可以像这样修改你的awk命令:

awk 'NR > 2 { cmd=sprintf("aws s3 --profile Admin-Profile mv \"s3://<bucket>/documents/%s.pdf\\" \"s3://<bucket>/documents/%s.pdf\"", $3, $1); system(cmd) }'

sprintf函数用于生成命令字符串,然后system()函数用于执行它。请记住,直接从awk运行shell命令应该谨慎,因为命令将按原样运行,而不会检查错误或意外情况。如果您的环境中存在SQL注入或其他恶意活动的风险,那么第一种方法(生成脚本然后运行它)会更安全。

hzbexzde

hzbexzde2#

主要问题可能是由于您试图在awk语句中使用AWS CLI命令的方式。awk不是shell,因此不能直接执行shell命令。
一个可能的解决方案是使用awk生成包含所有必要AWS CLI命令的shell脚本,然后执行该脚本。以下是如何修改代码:

export PGPASSWORD="<my_password>"

echo "SELECT id, number FROM mytable"                   \
  | psql -h <local-docker-ip> -p <docker-port> -U <user> \
  | head -n -2                                           \
  | awk 'NR > 2 { printf("aws s3 --profile Admin-Profile mv \"s3://<bucket>/documents/%s.pdf\" \"s3://<bucket>/documents/%s.pdf\"\n", $3, $1) }' \
  > aws_commands.sh

然后你可以运行这个脚本(确保它是可执行的):

chmod +x aws_commands.sh
./aws_commands.sh

这段代码基于PostgreSQL查询的输出,用aws s3 mv命令构造一个shell脚本aws_commands.sh,然后执行该脚本。
需要注意的一点是awk命令中printf的用法。这允许您将输出格式化为字符串,其中%s将按顺序替换为以下参数。另外,请记住,应该使用$引用shell变量。
请确保在执行之前检查aws_commands.sh的正确性。如果要重命名的文件数量很大,请考虑先在一小部分文件上测试脚本。
此外,如果您要处理大量文件,这种方法可能会有性能问题,因为它对每个文件执行单独的aws s3 mv命令。如果性能成为问题,您可能需要考虑使用AWS SDK for Python(Boto3)来更有效地执行这些操作。

相关问题