【发布时间】:2016-05-19 08:28:25
【问题描述】:
当我运行一个名为 chk 的自定义脚本并将其输出到 csv 时,我正在编写一个 bash 脚本来获取屏幕输出。
chk 命令的屏幕输出示例
type: ISDSL ACCESS ADSL
circt: 219317638
speed: 4096
rroutr: Billion 7404 (IS)
intr: 196.214.12.124/30
vrf: PCTPT
我的命令 $line 可以是任何 linetag
chk $line | egrep 'type|circt|speed|rroutr|intr|vrf' | awk'{if(NR==1){print " Circuit,Speed,CE,,WAN IP,VRF";}
else{print $2 $3} ORS=","}'
这个的输出是
Circuit,Speed,CE,,WAN IP,VRF
219317638,4096,Billion,196.214.12.124/30,PCTPT
在此之后,我想向脚本输入一个项目列表($line),我想在其上运行自定义脚本并将每个屏幕输出解析到 csv 文件中。
# This script takes in a file of many $line's and runs the chk command on each line usage ./parsechk2csv <filename>
#!/bin/bash
cat $1|while read line; do
echo "$line\n";
chk $line | egrep 'type|circt|speed|rroutr|intr|vrf' | awk'{if(NR==1) {print "";}else{print $2 $3} ORS=","}' >> test.csv
done
它或多或少地工作,但有两件事我遇到了困难。
如何在我的最终脚本中包含 csv 文件标题,而不会在 shell 脚本中循环一直重写标题(您会注意到我在当前脚本 awk 命令中留下了标题)。使用 NR==1 还会覆盖我需要的屏幕输出中的第一行
如何使用命令 args 来指定输出 csv 文件的名称。我试图重定向到 >>$3.csv 但这不起作用。
【问题讨论】:
-
数据行中的条目小于标题行...这似乎是错误的。即使缺少其中一列,您也必须插入一个占位符列。类似于
219317638,4096,,pep-ctn3-dsl/e0,Billion,196.214.12.124/30,的通知 2,在4096之后。 -
感谢您的反馈。我忘了提到我想将 $line 变量添加为 csv 文件中第一个字段的数据
-
不管您的评论如何,您的标题行
LineTag,Circuit,Type,PE,Speed,WAN IP,VRF中仍然有 7 个字段,而 awk 输出中只有 5 个字段:@ 987654329@。 (或者当我们将最后一个逗号作为第 6 个(空)字段的字段分隔符时为 6),并且您的输入中只有 6 行。问题是不一致的。例如speed位于标题的第 5 列和数据行的第 2 列 (4096)。所以,编辑问题,更正它,并添加示例输出你真正想要什么。