【问题标题】:Awk in Ansible shell module provides unexpected newline or end of stringAnsible shell 模块中的 awk 提供了意外的换行符或字符串结尾
【发布时间】:2020-11-18 20:29:52
【问题描述】:
- shell: " su {{user}} -c 'ps -ef | awk \'{print $2}\''"
  register: result
  

在 {print

之后收到意外的换行或字符串结尾错误

我必须使用 su 而不是成为插件,还必须使用 awk 来过滤输出

AWK (unexpected newline or end of string)

有没有办法为下面的命令转义“内部打印。(\”不起作用)

"su {{user}} -c 'ps -ef | awk \'{print "$2"}\''"

【问题讨论】:

  • 试试- shell: " su {{user}} -c 'ps -ef | awk \'{print \$2}\''"

标签: bash shell awk ansible


【解决方案1】:

实现目标的逃避可能性的非详尽列表。这里的问题是 yaml 在到达您的 shell 之前应用了自己的转义序列。你可以找到更多的可能性。

采取 1:

- shell: "su {{ user }} -c \"ps -ef | awk '{print \\$2}'\""
  register: result

采取 2:

- shell: su {{ user }} -c "ps -ef | awk '{print \$2}'"
  register: result

采取 3:

- shell: su {{ user }} -c 'ps -ef | awk "{print \$2}"'
  register: result

采取 4(来自@Paolo 的修复解决方案):

- shell: su {{ user }} -c 'ps -ef | awk '\''{print $2}'\'
  register: result

...最终将继续...

【讨论】:

  • 所以你给出了 3 个不同的选项,哪一个是解决方案?全部?
  • 他们都给出了正确的结果。根据您的以下答案,我刚刚添加了一个。
  • Take 5: - shell: | \n su {{ user }} -c "ps -ef | awk '{print \$2}'",使用 YAML litteral,它使使用 shell 命令变得“容易”:如果它在主机上工作,它将在任务中工作,而 YAML 不会不要用额外的引号或更多的转义来打扰你:)
  • @β.εηοιτ.βε 你的 take 5 和我的 take 2 完全一样。单行时不需要放置块指示符 ;)
  • 没错,但这更像是一种“不用担心 YAML 解析奇怪”的方式 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多