regex - 如何在 awk 命令中支持不常见的字符

标签 regex linux bash perl awk

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

  1. 读取 CSV 密码名称和 CSV 密码值
  2. 打印每行 CSV 的 CSV 密码名称和 CSV 密码值(密码值来自第二行)

请看一下 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=

最佳答案

您需要在 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

关于regex - 如何在 awk 命令中支持不常见的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24904064/

相关文章:

php - 拆分字符串中的第一个空格和最后一个空格并限制输出的大小 3

java - 如何使用单个 replaceAll 查找 Java 中两个字符串的公共(public)字符?

javascript - 匹配这个或完全匹配那个的正则表达式

javascript - 如何在逗号处拆分字符串但忽略\,?

linux - 文件权限的测试条件

Bash 脚本通过删除最后访问的文件来限制目录大小

bash - 如何删除远程机器上 authorized_keys 文件中的重复行

linux - Docker 容器可以访问 DNS 但不能解析主机

.net - mono linux 中的 mscoree.dll 在哪里?

string - bash shell脚本将字符串与句点字符连接起来