【问题标题】:Calling bash command with If/Else and awk使用 If/Else 和 awk 调用 bash 命令
【发布时间】:2014-09-12 06:21:52
【问题描述】:

我希望获取我的 S3 存储桶上大于 200 KB 的所有文件。经过一番研究,我能够使用以下命令递归地生成我的 S3 存储桶中大于 200 KB 的所有文件的列表:

s3cmd ls -r s3://mybucket | awk '{if ($3 > 200000) print $4}' > files.txt

理想情况下,我不仅希望找到所有大于 200KB 的文件,而且还希望在同一命令中获取它们,而不是仅仅生成一个列表。

我正在寻找类似的东西,但它显然不正确。

s3cmd ls -r s3://mybucket | awk '{if ($3 > 200000) "s3cmd get $4" }'

参考:如果您不熟悉 s3cmd:$3 返回文件大小,$4 返回 s3cmd 返回的特定文件的文件名。

提前感谢您的帮助。

问题:

如何使用 awk 在另一个 bash 命令中调用另一个 bash 命令?

【问题讨论】:

  • awk 不是外壳。不要用嵌套调用层 (shell { awk { system { shell { s3cmd } } } }) 来破坏你的代码,试图让它像一个一样,只需让 shell 调用 awk,然后像 @GlennJackman 显示的那样对其结果进行操作 (shell { awk | xargs s3cmd })。

标签: bash shell command-line awk s3cmd


【解决方案1】:
s3cmd ls -r s3://mybucket | awk '$3 > 200000 {print $4}' | xargs s3cmd get

【讨论】:

  • 此处适用有关带有空格的文件名的常见警告。
  • 这篇文章被标记为低质量。我建议删除。请通过解释和一些限定词提高帖子的质量,以便未来的用户理解。
  • @Jeremy 这是一个合法的答案。它不值得删除。
  • @Jeremy 这是这个问题的正确答案,无法想象你为什么要删除它。这很清楚,但如果有人有问题,他们可以随时提出。
  • 我认为这里缺少-d '\n'
【解决方案2】:

当涉及使用从文本文件中获取的参数执行二进制文件时,bash 会更好,因为它可以安全地扩展包含空格作为参数的变量。

while read -ra A; do
    [[ ${A[2]} -gt 200000 ]] && s3cmd get "${A[3]}"
done < <(s3cmd ls -r s3://mybucket)

【讨论】:

  • 这会将文件名中的反斜杠解释为,例如,将名为foo\tbar 的文件转换为foo&lt;tab&gt;bar&gt;,其中&lt;tab&gt; 表示文字制表符。
【解决方案3】:

你可以在awk中使用system函数:

s3cmd ls -r s3://mybucket | awk '($3 > 200000) { system("s3cmd get " $4); }'

【讨论】:

  • if 发生了什么?
  • ($3 &gt; 200000) 是隐含的 if 条件。
  • $4 似乎没有被传递到系统中(“s3cmd get $4”),关于解决这个问题有什么想法吗?
  • 你可以试试:awk '($3 &gt; 200000) { system("s3cmd get " $4); }'
  • 如果你执行system("s3cmd get " $4) - 如果$4 包含shell globbing 字符会发生什么?
猜你喜欢
  • 1970-01-01
  • 2017-11-25
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多