Regex 如何在awk命令中支持非常用字符
下面的bash脚本-从_csv.bash读取密码执行以下操作Regex 如何在awk命令中支持非常用字符,regex,linux,bash,perl,awk,Regex,Linux,Bash,Perl,Awk,下面的bash脚本-从_csv.bash读取密码执行以下操作 读取CSV密码名称和CSV密码值 打印每个CSV行的CSV密码名称和CSV密码值(密码值来自第二行) 请查看CSV中的第二行,密码仅为a-z和数字字符 因此,如果我运行脚本,所有密码名称和值都将打印为示例1 但是当我们在脚本中设置CSV\u LINE=3以读取第三行CSV时, 脚本给出了以下错误,因为未找到命令,因为异常字符为“$”或“*”或“/”或“\”,如示例2所示 所以 请建议如何更改/修复我的bash脚本中的awk语法,以支持
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
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\u line=2)时的脚本输出示例
示例2
在CSV中读取第三行(CSV\u line=3)时的脚本输出示例
您需要在
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 )
实际上,我认为他指的是非ASCII字符。是的,我最初也这么认为,但在查看示例数据后,我意识到他指的是
非字母数字。我发现了一个错误,如果密码带有空格和as-->&^ G TR/$@H,@Y^%“E”awk-需要支持空格!你试过非评估解决方案吗?
./readPassword_from_csv.bash
CSV_LINE=2
Password1=hdehbcr
Password1=fre435fr
Password1=443f4
Password1=544fr4fr4
Password1=454534rf4
Password1=r3443tr
Password1=5345rd
Password1=545trr34
./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=
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 )
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