首页 > 解决方案 > 重构时将 awk 输出放入变量中

问题描述

我正在解析网站,awked 数据的某些部分应该写在变量中:

grep -o -E 'Date:.*Name'|sed -e 's/Date:/|/g' -e 's/Type/|/g' -e 's/Name/|/g'| awk -F '|' '{print $3"|"$1"|"$2}' 

并且只有最后一个 awk 应该写在变量中。

简单尝试:

body=$(awk -F '|' '{print $3"|"$1"|"$2}')| echo $body- 空输出

标签: bashawk

解决方案


body=$(awk -F '|' '{print $3"|"$1"|"$2}')| echo $body 

将给出空输出,因为|创建了一个子shell并执行了echo $bodyin 子shell。要使其显示 的值body,请将其更改为:

body=$(awk -F '|' '{print $3"|"$1"|"$2}'); echo $body 

实现预期目标的正确方法是使用命令替换:

variable=$(grep -o -E 'Date:.*Name'|sed -e 's/Date:/|/g' -e 's/Type/|/g' -e 's/Name/|/g'| awk -F '|' '{print $3"|"$1"|"$2}' )

或者,您可以使用 read 来获取值,但不能在 subshel​​l 之外使用它。

grep -o -E 'Date:.*Name'|sed -e 's/Date:/|/g' -e 's/Type/|/g' -e 's/Name/|/g'| awk -F '|' '{print $3"|"$1"|"$2}' | read body; echo $body
echo $body #will give empty here since the value of body existed only in subshell

推荐阅读