如何将AWK输出传递给变量?

8

我有一个小的bash脚本,可以通过关键字使用grep/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;

谢谢!


3
养成将变量加上双引号的习惯:echo "$var"。这通常可以避免因文件名中包含空格而导致的问题。 - glenn jackman
5个回答

9

使用命令替换来捕获进程的输出。

#!/bin/sh

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

以下是关于shell脚本的一些通用建议:

  • (几乎)总是引用每个变量引用。
  • 在变量赋值时,永远不要在等号周围加空格。

1
@JavaNoob,在反引号内部使用反斜杠要小心。请参见这里http://mywiki.wooledge.org/BashFAQ/082。 - Lesmana

3
  • 您需要使用“命令替换”。将命令放置在反引号 `COMMAND` 中,或者在一个带有美元符号前缀的括号中 $(COMMAND)
  • 要设置变量,您不使用 set 并且不能在 = 前后加空格。

请尝试以下操作:

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

2
你给了我一个关于结束进程的想法 :). 只需将 "chromium" 替换为你想要结束的任何进程即可。
尝试这个:
VAR=$(ps -ef | grep -i chromium | awk '{print $2}'); kill -9 $VAR 2>/dev/null; unset VAR;

通常情况下,您希望使用ps -C参数,例如ps -C chromium。像这样使用grep与ps输出将最终会对您造成影响,当vim中打开了与您正在搜索的命令匹配的文件名时。您可以通过使用ps -C chromium -o pid =来指定只有pid在输出中,从而节省awk。 - dannysauer
或者只需使用 killall chromium,我猜 ;) - dannysauer

1
无论何时您看到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}.

0
尝试创建一个来自Vault/Hashicorp的变量,当使用Packer模板变量时,可以这样做:
BUILD_PASSWORD=$(vault read secret/buildAccount| grep ^password | awk '{print $2}')
echo $BUILD_PASSWORD

你可以使用 grep ^user 来做同样的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接