用于从 csv 创建具有未知列的多个数组的 Bash 脚本。
我正在尝试编写一个脚本来比较两个具有相似列的 csv 文件。我需要它从其他 csv 中找到匹配列并比较任何差异。踢球者是我希望脚本是动态的,以允许输入任意数量的列并且它仍然能够运行。我以为我有一个很好的计划来解决这个问题,但结果我遇到了语法错误。这是我需要比较的 csv 样本。
IP address, Notes, Nmap-SSH, Nmap-SMTP, Nmap-HTTP, Nmap-HTTPS,
10.0.0.1, , open, closed, open, open,
10.0.0.2, , closed, open, closed, closed,
当我阅读 csv 文件时,我正计划查找“IF 列 == 打开;然后;使用 IP 地址填充此列的数组”在这种情况下,这将给我 4 个列表,其中包含正在侦听所述端口的 IP。然后,我可以将其与我的安全设备配置进行比较,以确保其配置正确。最后是肉,这是我认为可以完成创建数组供我稍后搜索的内容。但是,当我尝试在数组名称中使用变量时遇到了障碍。可以纠正我的语法还是有更好的方法来做这种事情?
#!/bin/bash
#
#
# This script compares config_cleaned_<ip>.txt output against ext_web_env.csv and outputs the differences
#
#
# Read from ext_web_env.csv file and create Array
#
FILENAME=./tmp/ext_web_env.csv
#
index=0
#
while read line
do
# How many columns are in the .csv?
varEnvCol=$(echo $line | awk -F, '{print NF}')
echo "columns = $varEnvCol"
# While loop to create array for each column
while [ $varEnvCol != 2 ]
do
# Checks to see if port is open; if so then add IP address to array
varPortCon=$(echo $line | awk -F, -v i=$varEnvCol '{print $i}')
if [ $varPortCon = "open" ]
then
arr$varEnvCol[$index]="$(echo $line | awk -F, '{print $1}')"
# I get this error message "line29 : arr8[194]=10.0.0.194: command not found"
fi
echo "arrEnv$varEnvCol is: ${arr$varEnvCol[@]}"
# Another error but not as important since I am using this to debug "line31: arr$varEnvCol is: ${arr$varEnvCol[@]}: bad substitution"
varEnvCol=$(($varEnvCol - 1))
done
index=$(($index + 1 ))
done < $FILENAME
更新
我还尝试使用 eval 命令,因为所有数据都将由其他脚本填充。
但我收到此错误消息:
./compare.sh:第 41 行:arr8[83]=10.0.0.83:找不到命令
这是此示例的新代码:
if [[ $varPortCon = *'open'* ]]
then
eval arr\$varEnvCol[$index]=$(echo $line | awk -F, '{print $1}')
fi