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нιmetとほぼ同じです。サーバー名を保存するときは、BEGINブロックを使用してヘッダーを書き込み、行の割り当てを消去します。$0 = ""

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

関連情報