如何根据来自不同命令的多行打印输出的输入将文本文件内容替换为“sed”或“awk”?
Posted
技术标签:
【中文标题】如何根据来自不同命令的多行打印输出的输入将文本文件内容替换为“sed”或“awk”?【英文标题】:How to replace text file content with 'sed' or 'awk' based on input originated from multiple-row printout of a different command? 【发布时间】:2014-06-29 16:24:07 【问题描述】:模板文件内容(template.txt):
[Load]
<CPU-ALL>
<CPU-0>
<CPU-1>
<CPU-2>
<CPU-3>
mpstat -P ALL | awk '$12 ~ /[0-9.]+/ print 100 - $12 '
命令将在连续的行中为您提供每个结果:
14
13
13
13
17
我的目标是使用新文件作为目标(而不是覆盖模板)将所有 CPU-x
标签替换为相应的数据:
结果文件(result.txt):
[Load]
<14>
<13>
<13>
<13>
<17>
我只是不知道如何在一个命令中执行它而不为每个数据替换执行四次 mpstat - 考虑到它会导致的延迟,这不是一个解决方案。
提前感谢您的帮助!
【问题讨论】:
您的模板是否包含其他内容? 嗨阿什坎,是的,它有。这就是为什么我想一些事情,例如应该使用 sed -i 's/original/new' result.txt (可能首先将 template.txt 复制到 result.txt)。 【参考方案1】:awk 'FNR==NRa[i++]=$1;nextif($1~/CPU-ALL|CPU-[0-9]+/) sub(/<CPU-ALL>|<CPU-[0-9]+>/,"<"a[j++]">")1' <(mpstat -P ALL | awk '$12 ~ /[0-9.]+/ print 100 - $12 ') template.txt > result.txt
我的模板:
[load]
<CPU-ALL>
<CPU-0>
<CPU-1>
输出:
[load]
<52.3>
<53.69>
<50.92>
【讨论】:
感谢您的帮助,但它给了我以下错误消息:Syntax error: "(" unexpected
@Akos,这使用了 Process Substitution,这在 posix 模式下不可用,因此如果您现在这样做,请不要通过 sh 运行它,而是使用 bash。如果未启用,您也可以通过 set +o posix 启用 posix 模式。
对不起,我对此很陌生。如果我通过 bash ./script.sh 执行它,那么它会告诉我模板不存在:awk: cannot open template (No such file or directory)
。输入文件不应该是 template.txt (无论如何,我已经尝试过了,同样的错误)。我也没有看到您编写的命令中提到的 result.txt 。我错过了什么吗?谢谢。
@Akos,是的,它必须是 template.txt 或任何您的模板文件名。要以文件名 result.text 获得结果,您应该将输出重定向到它。不管怎样,我编辑了它。以上是关于如何根据来自不同命令的多行打印输出的输入将文本文件内容替换为“sed”或“awk”?的主要内容,如果未能解决你的问题,请参考以下文章
linux shell “cat <<EOF“的作用,用于连续输出多行文本(连续打印)(文本块)
linux shell “cat <<EOF“的作用,用于连续输出多行文本(连续打印)(文本块)