将 shell 结果转换为列中的 Excel 文件

将 shell 结果转换为列中的 Excel 文件

我正在运行一个 shell 脚本,它给出以下结果,我想将结果存储在 Excel 中的不同列(主机、状态、过期、天数)中。我怎样才能转换成Excel?

Host                                            Status       Expires      Days
----------------------------------------------- ------------ ------------ ----
FILE:certs/dnscert.crt                          Valid        Aug  4, 2021  359

答案1

修改示例输入:

$ cat input
Host                                            Status       Expires      Days
----------------------------------------------- ------------ ------------ ----
FILE:certs/dnscert1.crt                         Valid        Aug  1, 2020  7
FILE:certs/dnscert2.crt                         Invalid      Aug  4, 2021  359
FILE:certs/dnscert3.crt                         Valid        Aug  4, 2021  359

然后,如果我应用以下awk命令,我会得到:

$ awk 'NR > 2 { print $1 "," $2 ",\"" $3, $4, $5 "\"," $6}' input
FILE:certs/dnscert1.crt,Valid,"Aug 1, 2020",7
FILE:certs/dnscert2.crt,Invalid,"Aug 4, 2021",359
FILE:certs/dnscert3.crt,Valid,"Aug 4, 2021",359

假设日期字段始终为 3 个标记:月、日和年。

跳过NR > 2前两行:标题和分隔符。其余的只是打印在 then 之间用逗号分隔的字段,并注意引用日期字段。

答案2

假设 shell 脚本为数据提供空格进行布局,您可以使用 awk 转换为制表符分隔。 Excel 将打开一个制表符分隔的文件(可能会抱怨格式不匹配),并允许用户在需要时另存为 xlsx。

$my_script | awk -v OFS='\t' '{$1=$1}1' > myexcel.xls

它使用了一个技巧来强制使用OFS,然后打印。或者不那么神秘的:

$my_script | '{print $1 "\t" $2 "\t" $3 "\t" $4}' > myexcel.xls

您最喜欢的脚本语言有一些模块可以生成“真正的”xlsx 文件(它只是 XML 的压缩目录),但这会涉及更多内容。如果您只需要用户可以单击并在 Excel 中打开的内容,则使用 xls 扩展名进行制表符分隔就可以了。

答案3

这些字段本身也包含像日期字段这样的空格,因此我们必须设计另一种策略。

使用标头(假设字段名称中没有空格)获取每个字段的字段宽度,并将其插入 awk 的 FIELDWIDTHS 内置变量中,第二次传递输入文件。

$ fw=$(< file \
   awk -v FPAT='[^[:space:]]+([[:space:]]+|$)' '  NR>1{exit}
{for (i=1; i<=NF; i++) $i=length($i)}1')

$ awk \
  -v q=\" -v OFS=,     \
  -v FIELDWIDTHS="$fw" \
'
function trim(a,  l, t) {
  l = "^[[:space:]]+"
  t = "[[:space:]]+$" 
  re = l "|" t
  gsub(re, "", a)
  return a
}
function quote(a,  r, nondigit) {
  r = "[^[:digit:]]"
  nondigit = a ~ r
  return nondigit ? q a q : a
}
NR==2{next} 
{
  for (i=1; i<=NF; i++) {
    t = $i
    gsub(/"/, "\\&", t)
    t = trim(t)
    $i = quote(t)
  }
}1' file

"Host","Status","Expires","Days"
"FILE:certs/dnscert.crt","Valid","Aug  4, 2021",359

相关内容