以下bash脚本 - 读取Password_from_csv.bash 执行以下操作
请以CSV格式查看第二行,密码只有 a-z 和数字字符
因此,如果我运行脚本,所有密码名称和值都将打印为示例1
但是当我们在脚本中设置 CSV_LINE = 3 以便读取第三个CSV行时, 该脚本在找不到命令时给出了以下错误,因为通常的字符为" $"或" *"或" /"或" \" ,如示例2
所以
请建议如何更改/修复我的bash脚本中的awk语法,以支持通常的字符 并从我的CSV中的第三行打印密码?
more readPassword_from_csv.bash
#!/bin/bash
CSV_LINE=2
eval $(awk -v line=$CSV_LINE -F, 'NR==1 { for (i=1; i<=NF; i++) sn[i]=$i }
NR==line { for (i=1; i<=NF; i++) print sn[i] "=" $i ; exit }' all_passwords.CSV )
echo CSV_LINE=$CSV_LINE
echo Password1=$Password1
echo Password1=$Password2
echo Password1=$Password3
echo Password1=$Password4
echo Password1=$Password5
echo Password1=$Password6
echo Password1=$Password7
echo Password1=$Password8
more all_passwords.CSV
Password1,Password2,Password3,Password4,Password5,Password6,Password7,Password8
hdehbcr,fre435fr,443f4,544fr4fr4,454534rf4,r3443tr,5345rd,545trr34
&^#GTR$@H,@Y^%ER$%*&*UJ,**U&^#%%@$^&//\\,^T%!#&^YG.+___KI*&HHTY,%%@$#!%^#&,P/\06E87*UHG11#,edehu234#@!&,~hum&T%6e4
CSV的另一个例子,在这种情况下我们有空格:
Password1,Password2,Password3,Password4,Password5,Password6,Password7,Password8
&^#G TR / / $@H,@Y^%" E "R$%*&*UJ,**U&^#%%@$^&//\\,^T%!#&^YG.+___KI*&HHTY,%%@$#!%^#&,P/\06E87*UHG11#,edehu234#@!&,~hum&T%6e4
示例1
我在CSV中读取第二行( CSV_LINE = 2 )时脚本输出的示例
./readPassword_from_csv.bash
CSV_LINE=2
Password1=hdehbcr
Password1=fre435fr
Password1=443f4
Password1=544fr4fr4
Password1=454534rf4
Password1=r3443tr
Password1=5345rd
Password1=545trr34
示例2
我在CSV中读取所有行( CSV_LINE = 3 )时脚本输出的示例
./readPassword_from_csv.bash
./readPassword_from_csv.bash
./readPassword_from_csv.bash: line 8: ^#%%@$^: command not found
./readPassword_from_csv.bash: line 8: //\: No such file or directory
./readPassword_from_csv.bash: line 8: ^YG.+___KI*: command not found
./readPassword_from_csv.bash: line 8: HHTY: command not found
./readPassword_from_csv.bash: line 8: T%6e4: command not found
CSV_LINE=3
Password1=
Password1=
Password1=
Password1=
Password1=
Password1=
Password1=
Password1=
答案 0 :(得分:1)
您需要在eval
+ awk
命令中使用引号:
eval $(awk -v line=$CSV_LINE -F, 'NR==1 { for (i=1; i<=NF; i++) sn[i]=$i }
NR==line { for (i=1; i<=NF; i++) print sn[i] "=\"" $i "\""; exit }' all_passwords.CSV )
但在这里使用eval
(例如间接参考)可以有更好的选择。
不使用eval
的替代纯BASH解决方案:
CSV_LINE=2
vars=()
c=1
while IFS=, read -ra arr; do
if ((c==1)); then
vars+=("${arr[@]}")
elif ((c==CSV_LINE)); then
for ((i=0; i<${#arr[@]}; i++)); do
declare ${vars[$i]}="${arr[$i]}"
done
fi
((c++))
done < all_passwords.csv