如何在awk命令中支持常用字符

时间:2014-07-23 07:16:19

标签: regex linux bash perl awk

以下bash脚本 - 读取Password_from_csv.bash 执行以下操作

  1. 阅读CSV密码名称和CSV密码值
  2. 打印每个CSV行的CSV密码名称和CSV密码值(密码值来自第二行)
  3. 请以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=
    

1 个答案:

答案 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