大编辑以便更好地理解:bash是否有可能将我的输出(行)放入csv文件中的列(关于以下挑战).
我的剧本:
#!/bin/bash
## get ports, status, vlan
devices=`ls *.txt`
for device in $devices
do
output=`echo $device | awk -F"." {'print $1'}`
echo "Port;Status;VLAN\r" > $output".csv"
port=`cat $device | awk 'BEGIN {OFS=";"}; /Fa[0-9]|Gi[0-9]|Te[0-9]/ && /disabled|connected/ {print $1}'`
stat=`cat $device | awk 'BEGIN {OFS=";"}; /Fa[0-9]|Gi[0-9]|Te[0-9]/ && /disabled|connected/ {print $0}' | awk 'match($0,"connected|disabled.*"){print substr($0,RSTART)}' | awk '{print $1}'`
vlan=`cat $device | awk 'BEGIN {OFS=";"}; /Fa[0-9]|Gi[0-9]|Te[0-9]/ && /disabled|connected/ {print $0}' | awk 'match($0,"connected|disabled.*"){print substr($0,RSTART)}' | awk '{print $2}'`
var=$(paste -d, <(echo "$port") <(echo "$stat") <(echo "$vlan"))
echo "$var" >> output."csv"
done
Run Code Online (Sandbox Code Playgroud)
.
<input-file.txt>
Port Name Status Vlan Duplex Speed Type
Fa0/1 disabled 1 auto auto 10/100BaseTX
Fa0/2 disabled 1 auto auto 10/100BaseTX
Fa0/3 disabled 1 auto auto 10/100BaseTX
Fa0/4 disabled 1 auto auto 10/100BaseTX
Fa0/5 disabled 1 auto auto 10/100BaseTX
Fa0/6 disabled 1 auto auto 10/100BaseTX
Fa0/7 disabled 1 auto auto 10/100BaseTX
Fa0/8 disabled 1 auto auto 10/100BaseTX
Fa0/9 disabled 1 auto auto 10/100BaseTX
Fa0/10 xxxx-xxx-xxx 0004. connected 3 full 100 10/100BaseTX
Fa0/11 xxxx-xxx-xxx bge0 connected 3 a-full a-100 10/100BaseTX
Fa0/12 xxxx-xxx-xxx iLO connected 2 a-full a-100 10/100BaseTX
Fa0/13 xxxx-xxx-xxx bge0 connected 2 a-full a-100 10/100BaseTX
Fa0/14 disabled 1 auto auto 10/100BaseTX
Fa0/15 xxxx-xxx-vpn bge0 connected 4 a-full a-100 10/100BaseTX
Fa0/16 xxxx-xxx-vpn ilO connected 2 a-full a-100 10/100BaseTX
Fa0/17 xxxx-xxx xx.xx.xx. connected 2 a-full a-100 10/100BaseTX
Fa0/18 xxxxxx-xxx1 connected 2 a-full a-100 10/100BaseTX
Fa0/19 disabled 1 auto auto 10/100BaseTX
Fa0/20 disabled 1 auto auto 10/100BaseTX
Fa0/21 xxxxx-xxxxx disabled 1 auto auto 10/100BaseTX
Fa0/22 xxxxxx-xxx disabled 1 auto auto 10/100BaseTX
Fa0/23 xxxx-xxx disabled 2 auto auto 10/100BaseTX
Fa0/24 xxxxxx-xxxx disabled 1 auto auto 10/100BaseTX
Fa0/25 disabled 1 auto auto 10/100BaseTX
Fa0/26 disabled 1 auto auto 10/100BaseTX
Fa0/27 disabled 1 auto auto 10/100BaseTX
Fa0/28 disabled 1 auto auto 10/100BaseTX
Fa0/29 disabled 1 auto auto 10/100BaseTX
Fa0/30 disabled 1 auto auto 10/100BaseTX
Fa0/31 disabled 1 auto auto 10/100BaseTX
Fa0/32 disabled 1 auto auto 10/100BaseTX
Fa0/33 disabled 1 auto auto 10/100BaseTX
Fa0/34 disabled 1 auto auto 10/100BaseTX
Fa0/35 disabled 1 auto auto 10/100BaseTX
Fa0/36 disabled 1 auto auto 10/100BaseTX
Fa0/37 disabled 1 auto auto 10/100BaseTX
Fa0/38 disabled 1 auto auto 10/100BaseTX
Fa0/39 disabled 1 auto auto 10/100BaseTX
Fa0/40 disabled 1 auto auto 10/100BaseTX
Fa0/41 disabled 1 auto auto 10/100BaseTX
Fa0/42 disabled 1 auto auto 10/100BaseTX
Fa0/43 disabled 1 auto auto 10/100BaseTX
Fa0/44 disabled 1 auto auto 10/100BaseTX
Fa0/45 disabled 1 auto auto 10/100BaseTX
Fa0/46 disabled 1 auto auto 10/100BaseTX
Fa0/47 disabled 1 auto auto 10/100BaseTX
Fa0/48 disabled 1 auto auto 10/100BaseTX
Gi0/1 Xxxxxxxx Xxxxx xx connected trunk a-full a-1000 10/100/1000BaseTX SFP
Gi0/2 Xxxxx xxxxxxx Xxx connected trunk a-full a-1000 1000BaseSX SFP
Gi0/3 disabled 1 auto auto Not Present
Gi0/4 disabled 1 auto auto Not Present
Run Code Online (Sandbox Code Playgroud)
脚本输出的结果应该是:
<output.csv>
| Port | Status | VLAN |
| Fa0/1 | disabled | 1 |
| Fa0/2 | disabled | 1 |
| Fa0/3 | disabled | 1 |
| Fa0/4 | disabled | 1 |
| Fa0/5 | disabled | 1 |
| Fa0/6 | disabled | 1 |
| Fa0/7 | disabled | 1 |
| Fa0/8 | disabled | 1 |
| Fa0/9 | disabled | 1 |
| Fa0/10 | connected | 3 |
and so on
Run Code Online (Sandbox Code Playgroud)
问题:尝试"粘贴"命令后(感谢大家)..我收到以下错误:语法错误:"("意外
假设您有GNU awk,循环中的行可以压缩为这样的:
awk 'BEGIN{FIELDWIDTHS = "10 18 13 11"}{printf "| %s | %s | %s |\n", $1,$3,$4}' "$device"
Run Code Online (Sandbox Code Playgroud)
如果你有一个不同的awk,命令会更复杂,但仍然可以在一个awk语句中做你想要的.
你尝试的一些要点:
"$details"而不是使用$details),因为这可以保护您免受文件名中的空格引起的整类错误.cat将文件的内容传递给awk.cat由于大多数程序在其参数中接受文件的名称,因此很少需要一般地使用此类事物.如果他们不这样做,你总是可以使用program < filename而不是cat filename | program.ls是多余的(并且可能容易出现由名称尴尬的文件引起的错误).使用它会好得多for device in *.txt; 做......`作为最后一点,要小心谨慎地考虑一个问题的解决方案,然后询问如何实现它.根据各种工具的经验,其他人可以更容易地为更一般的问题提出最佳解决方案.在这种情况下,最终答案与您原始问题的答案非常不同!我现在把它留在下面.
如果你没有GNU awk,请告诉我,我会更新我的答案.
我想你可能正在寻找这个paste命令
paste file.txt anotherf.txt
Run Code Online (Sandbox Code Playgroud)
默认情况下,这两个文件将由制表符分隔.要使用其他内容,您可以指定-d开关,例如-d,将分隔符设置为逗号.
如果只想要每个文件的第一列,可以使用awk粘贴:
paste -d, <(awk '{print $1}' file.txt) <(awk '{print $1}' anotherf.txt)
Run Code Online (Sandbox Code Playgroud)
假设两个文件中的列由一个简单的分隔符(如空格)分隔,cut也会起作用:
paste -d, <(cut -f1 -d' ' file.txt) <(cut -f1 -d' ' anotherf.txt)
Run Code Online (Sandbox Code Playgroud)
根据您的问题的更新,如果您已将内容包含在两个变量中,则可以使用此命令:
paste -d, <(echo "$var1") <(echo "$var2")
Run Code Online (Sandbox Code Playgroud)
感谢所有在评论中做出贡献的人.
| 归档时间: |
|
| 查看次数: |
7362 次 |
| 最近记录: |