Bash 将变量值发送到 csv?

Bash 将变量值发送到 csv?

我有以下数据。为了简单起见,我在这里只给出了 2 台服务器。该服务器列表可能会不时更改,变量值也是如此。

hostname = 'server1'
var1 = 'abc'
var2 = 'xyz'
var3 = 'def'

hostname = 'server7'
var1 = 'ghi'
var2 = 'mno'
var3 = 'jkl'

是否可以将其发送为 csv 格式,可能是这样的?

输出.csv

Hostname    Variable    Value
server1     var1        abc
server1     var2        xyz
server1     var3        def
server7     var1        ghi
server7     var2        mno
server7     var3        jkl

目前,我将值手动复制粘贴到 Ms Excel 中。我想自动化这个过程,但还不确定实施情况。

如果您能分享一些想法或示例代码,我真的很感激。

答案1

使用awk

awk -F"[=' ]" -v OFS=, '
$1=="hostname"{ hn=$5; next }
!hdr && hn    { print "Hostname", "Variable", "Value"; hdr=1 }
NF   && hn    { print hn, $1, $5 }' infile >output.csv

对于-F"[=' ]",我们将='和 空格字符定义为字段分隔符,因此 awk 将根据这些分隔符将行拆分为字段。

使用OFS=,,输出会在逗号分隔的字段中生成,以生成一个简单的 csv 文件,根据您的需要将其更改为其他一些字符。

答案2

使用磨坊主和跑步

<input.txt sed "s/'//g" | mlr --x2c --ips "=" clean-whitespace then reshape -r "var" -o variable,value

你将会拥有

hostname,variable,value
server1,var1,abc
server1,var2,xyz
server1,var3,def
server7,var1,ghi
server7,var2,mno
server7,var3,jkl

如果您还想删除仅存在于字段值的开头和结尾的单引号,并且需要大写的字段名称:

mlr --x2c --ips = clean-whitespace then reshape -r '^var' -o Variable,Value then put 'for (k,v in $*) { $[k]=sub(v,"^'\''(.*)'\''$","\1") }' then label Hostname input.txt

答案3

答案与@αГsнιη 几乎相同。当保存服务器名称时,我使用一个BEGIN块来写入标头和清空该行的分配。$0 = ""

awk -F"[= ']" -vOFS=, 'BEGIN {print "Hostname", "Variable", "Value"} $5~/^server[0-9]+$/ && h=$5 {$0 = ""} $0!~/^$/ {print h, $1, $5}' data

相关内容