【问题标题】:Iterating over awk return and running a command on each item遍历 awk 返回并在每个项目上运行命令
【发布时间】:2022-01-17 23:26:30
【问题描述】:

我想列出我使用 awk 收到的实例名称,然后将它们一一删除。我已经通过它们各自的列提取了实例名称并忽略了列标题名称。我有实例名称列表,但我一直在弄清楚如何对每个名称运行删除命令。我相信 awk 正在返回一个大字符串,但我不知道如何拆分字符串并通过我的删除命令运行它。

这是行不通的行

 multipass list | awk '{print $1}' | awk 'NR!=1 {print}' | xargs -0 multipass delete

这是我得到的回报

instance "k3s
node1
node2
symfony
" does not exist

【问题讨论】:

  • multipass list 命令的结果是什么样的?
  • awk 可以处理整个进程,而无需通过管道传输到多个进程。在awk 中,您可以使用system (rm" "filename)awk 中删除文件。每当您使用awk 并发现自己在使用process | process2 | process3 | ... 时,很可能只需一次调用awk 即可完成。
  • @DavidC.Rankin ITYM system ("rm -- \047"filename"\047") 否则 rm 是一个空变量,shell 将获得 filename 未引用,如果它以 - 开头,则会失败。
  • 使用xargs -0,您是在告诉 xargs 输入是 NUL 分隔的,而不是换行分隔的 - 不要那样做。
  • @EdMorton - 很好,我知道我总是首先使用sprintf() 是有原因的...

标签: bash awk xargs


【解决方案1】:

试试这个:

multipass list | awk 'NR!=1 {system("multipass delete "$2"")}'

【讨论】:

  • 这会将$2 不带引号地传递给shell 进行解释,因此容易出现通配、文件名扩展和安全问题。始终引用您在 shell 中使用的任何字符串,例如system("multipass delete \047"$2"\047")
猜你喜欢
  • 1970-01-01
  • 2018-01-04
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多