как поддерживать обычные символы в команде awk

Вопрос:

Следующий скрипт bash – прочитайте Password_from_csv.bash, выполните следующие

  1. читать имена паролей CSV и значения пароля CSV
  2. печатать имена паролей CSV и значения пароля CSV для каждой строки CSV (значения пароля относятся ко второй строке)

просмотрите вторую строчку в CSV, пароль прост: только цифры az и числа

поэтому, если я запустил скрипт, все имена и значения паролей будут напечатаны в качестве примера 1

но когда мы устанавливаем CSV_LINE = 3 в скрипте, чтобы прочитать третью строку CSV, скрипт дает нам следующие ошибки, поскольку команда не найдена, потому что обычные символы как “$” или “*” или “/” или “\ “, как пример 2

так

пожалуйста, совет, как изменить/исправить синтаксис awk в моем сценарии bash, чтобы поддерживать обычные символы и печатать пароль из третьей строки в моем 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
&^#[email protected],@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  /  /  [email protected],@Y^%"  E  "R$%*&*UJ,**U&^#%%@$^&//\\,^T%!#&^YG.+___KI*&HHTY,%%@$#!%^#&,P/\06E87*UHG11#,edehu234#@!&,~hum&T%6e4

example1

пример вывода скрипта, когда я читаю вторую строку (CSV_LINE = 2) в CSV

  ./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_LINE = 3) в CSV

  ./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

Вам нужно использовать кавычки в команде 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 (например, косвенной ссылки).

ОБНОВИТЬ:

Альтернативное чистое решение BASH без использования eval:

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

Оцените статью
TechArks.Ru
Добавить комментарий