【问题标题】:How to pass AWK output into variable?如何将 AWK 输出传递给变量?
【发布时间】:2011-04-16 14:31:01
【问题描述】:

我有一个小 bash 脚本,它使用关键字 greps/awk 段落。

但在添加额外代码后:set var = "(......)" 它只打印一个空行而不是段落。

所以我想问一下有没有人知道如何正确地将awk输出传递到一个变量中进行输出?

我的代码:

#!/bin/sh

set var = "(awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/FileHeader/' /root/Desktop
/logs/Default.log)"
echo $var;

谢谢!

【问题讨论】:

  • 养成在变量两边加上双引号的习惯:echo "$var"。这通常会吸引文件名包含空格的用户。

标签: linux awk paragraph


【解决方案1】:

使用command substitution 捕获进程的输出。

#!/bin/sh

VAR="$(awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/FileHeader/' /root/Desktop/logs/Default.log)"
echo "$VAR"

关于 shell 脚本的一些一般建议:

  • (几乎)总是引用每个变量引用。
  • 切勿在变量赋值中的等号周围放置空格。

【讨论】:

【解决方案2】:
  • 您需要使用“命令替换”。将命令放在反引号内,`COMMAND`,或者放在一对前面有美元符号的括号内,$(COMMAND)
  • 要设置不使用set 的变量,并且= 前后不能有空格。

试试这个:

var=$(awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/FileHeader/' /root/Desktop/logs/Default.log)
echo $var

【讨论】:

    【解决方案3】:

    你给了我这个杀死进程的想法:)。只是铬到你想杀死的任何过程。

    试试这个:

    VAR=$(ps -ef | grep -i chromium | awk '{print $2}'); kill -9 $VAR 2>/dev/null; unset VAR;
    

    【讨论】:

    • 您通常希望使用ps -C 参数,如ps -C chromium。当在 vim 中打开一个文件名或与您正在搜索的命令匹配的文件名时,像这样使用 grep 和 ps 输出最终会回来咬你。您可以指定只有 pid 在输出中,使用 ps -C chromium -o pid= 保存 awk。
    • 或者只是使用killall chromium,我猜;)
    【解决方案4】:

    任何时候你看到 grep 通过管道传输到 awk,你都可以删除 grep。对于上述情况,

    awk '/^password/ {print $2}'
    

    awk 可以轻松替换任何文本命令,如 cut、tail、wc、tr 等,尤其是多个彼此相邻的 grep。即

    grep some_co.mand | a | grep b ... to | awk '/a|b|and so on/ {some action}.
    

    【讨论】:

      【解决方案5】:

      在使用打包程序模板变量时,尝试创建一个来自 vault/Hashicorp 的变量,如下所示:

      BUILD_PASSWORD=$(vault read secret/buildAccount| grep ^password | awk '{print $2}')
      echo $BUILD_PASSWORD
      

      你可以和grep ^user一样

      【讨论】:

        猜你喜欢
        • 2016-02-09
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-28
        相关资源
        最近更新 更多