当我运行一个名为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文件的名称。我尝试重定向到&gt;&gt; $ 3.csv,但这不起作用。
答案 0 :(得分:1)
不清楚输入文件的哪些行映射到输出中的哪些字段,因为您显示的值似乎与标题行中的名称无关,但这是如何做您想要的:
$ cat file
first linetag
type: ISDSL ACCESS ADSL
circt: 219317638
speed: 4096
routr: ctn3-dsl/e0
rroutr: Billion 7404 (IS)
intr: 196.214.12.124/30
vrf: first idk
second linetag
type: Next fake ACCESS
circt: 123456
speed: 2020
routr: foo-hspd/e1
rroutr: dozens 6564 (IS)
intr: 100.200.30.304/27
vrf: second idk
$ cat tst.sh
#infile="$1"
#outfile="${2:-test.csv}"
#<"$infile" xargs -d'\n' -n1 -Iline sh -c 'echo "line"; chk "line"' |
cat file |
awk -v RS= -F'\n' -v OFS="," '
BEGIN {
split("LineTag,Router,Type,Circuit,Speed,PE,WANIP,VRF",names,/,/)
split("linetag,routr,type,circt,speed,rroutr,intr,vrf",abbrs,/,/)
}
NR==1 {
for (i=1; i in names; i++) {
printf "%s%s", (i>1?OFS:""), names[i]
}
print ""
}
{
delete abbr2value
abbr2value[abbrs[1]] = $1
for (i=2; i<=NF; i++) {
abbr = value = $i
sub(/:.*/,"",abbr)
sub(/[^:]+:[[:space:]]*/,"",value)
abbr2value[abbr] = value
}
for (i=1; i in abbrs; i++) {
printf "%s%s", (i>1?OFS:""), abbr2value[abbrs[i]]
}
print ""
}'
#}' >> "$outfile"
$ ./tst.sh
LineTag,Router,Type,Circuit,Speed,PE,WANIP,VRF
first linetag,ctn3-dsl/e0,ISDSL ACCESS ADSL,219317638,4096,Billion 7404 (IS),196.214.12.124/30,first idk
second linetag,foo-hspd/e1,Next fake ACCESS,123456,2020,dozens 6564 (IS),100.200.30.304/27,second idk
只需替换cat file
(仅用于模拟运行chk
的输出两次,以便演示awk脚本正常工作),并使用当前注释掉的行开头脚本,并使用当前已注释的}'
替换最后的}' >> "$outfile"
,并根据需要更改split()
命令中字段的顺序。
请注意,与您今天的重大差异是: