如何使用Shell脚本创建CSV文件

10

我的输出目前是:

echo "Time Taken to checkout svn repository repo_performance hosted on $host on `date` is : $Time_checkout seconds" >> log.csv
    echo "Time Taken to add $loopmax 10MB svn files in svn repository repo_performance  hosted on $host `date` is : $Time_add seconds" >> log.csv
    echo "Time Taken to commit $loopmax 10MB svn files in svn repository repo_performance  hosted on $host on `date` is : $Time_commit seconds" >> log.csv

但是,我希望创建一个csv文件,其中每行都有主机、日期、操作、持续时间及其值。

我该如何使用脚本来制作它?

5个回答

12

你可以只做这个:

echo "$host, `date`, checkout,$Time_checkout" >> log.csv
echo "$host, `date`, add, $Time_add" >> log.csv
echo "$host, `date`, cimmit, $Time_commits" >> log.csv

没问题。但是我该如何创建我的 CSV 文件头,例如主机、日期、操作和持续时间? - devops

7
你可以尝试这样做:
printf "Host\tDate\tOperation\tDuration\n" >> log.csv
printf "$host\t$(date)\tTime Taken to checkout\t$Time_checkout\n" >> log.csv
printf "$host\t$(date)\tTime Taken to add $loopmax 10MB svn files\t$Time_add\n" >> log.csv
printf "$host\t$(date)\tTime Taken to commit $loopmax 10MB svn files\t$Time_commit\n" >> log.csv

1
printf 似乎是比 echo -e 更好的选择。@Mustafa DOGRU - alper

3
您可以将Mig82的答案推广到支持像这样的可变参数

# Usage: csv <items>

csv()
{
    local items=("$@")

    (
    IFS=,
    echo "${items[*]}"
    )
}

csv 1 "2 3" >> log.csv

使用此代码并进行微调以处理引用:csv() { local items=("$@") # 根据需要进行引用和转义 # https://datatracker.ietf.org/doc/html/rfc4180 for i in "${!items[@]}" do if [[ "${items[$i]}" =~ [,\"] ]] then items[$i]=\"$(echo -n "${items[$i]}" | sed s/\"/\"\"/g)\" fi done ( IFS=, echo "${items[*]}" ) } - Eric Isakson

1

如果有人在寻找双引号(")中包含值的CSV文件,您需要删除echo的外部引号,并对每个值使用它们(转义),如下所示:

echo \"$host\",\"$date",\"checkout\",\"$checkout_time\" >> log.csv
echo \"$host\",\"$date",\"add\",\"$add_time\" >> log.csv
echo \"$host\",\"$date",\"commit\",\"$commit_time\" >> log.csv

我建议编写一个函数,使您的脚本更简洁易读,就像这样。
write_csv(){
    echo \"$1\",\"$2\",\"$3\",\"$4\" >> log.csv
}
write_csv $host $date checkout $checkout_time
write_csv $host $date add $add_time
write_csv $host $date commit $commit_time

1
使用了@Nishant的答案,并稍作调整以处理引用:
    csv()
    {
        local items=("$@")
    
        # quote and escape as needed
        # https://datatracker.ietf.org/doc/html/rfc4180
        for i in "${!items[@]}"
        do
            if [[ "${items[$i]}" =~ [,\"] ]]
            then
                items[$i]=\"$(echo -n "${items[$i]}" | sed s/\"/\"\"/g)\"
            fi
        done
    
        (
        IFS=,
        echo "${items[*]}"
        )
    }

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