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

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语法,以支持

下面的bash脚本-从_csv.bash读取密码执行以下操作

  • 读取CSV密码名称和CSV密码值
  • 打印每个CSV行的CSV密码名称和CSV密码值(密码值来自第二行)
  • 请查看CSV中的第二行,密码仅为a-z数字字符

    因此,如果我运行脚本,所有密码名称和值都将打印为示例1

    但是当我们在脚本中设置CSV\u 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
    

    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