Bash AWK найти несколько шаблонов и назначить для различных переменных - PullRequest
0 голосов
/ 21 декабря 2018

В настоящее время у меня есть переменная, содержащая значения, подобные этому:

x_snd_user=''
x_snd_appli=''
x_snd_text=''
x_rcv_user=''
x_rcv_appli=''
x_rcv_text=''
x_dup_from_xfer='0'
x_route_from_xfer='0'
x_route_to_xfer='0'
x_reply_by_xfer='0'
x_reply_to_xfer='0'
x_routed_to_XIB='N'
x_end_xfer_script=''
x_ftp_command=''

Как, например, сопоставить 3 шаблона (x_snd_appli, x_route_from_xfer, x_ftp_command), отформатировать шаблоны (awk -F"'" '{print $2}') и назначить ихразные переменные?

Например, у меня есть переменные, и я хочу присвоить вывод следующим:

 - Application= The value of <x_snd_appli>
 - Route= The value of <x_route_from_xfer>
 - Command= The value of <x_ftp_command>

Желательно не с чем-то, что нужно установить, поскольку это невозможно.Так что с AWK / perl, если это возможно, было бы предпочтительным.

Полное содержимое переменной довольно большое (около 45 строк) и , возможно, это будет работать примерно в 1000 раз, когда я запускаюсценарий 1x.Поэтому я не хочу записывать данные в файл / цикл 10 раз для awk / grep различных значений и присваивать их переменным.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Как насчет:

#!/bin/bash

transfer="
x_snd_user=''
x_snd_appli=''
x_snd_text=''
x_rcv_user=''
x_rcv_appli=''
x_rcv_text=''
x_dup_from_xfer='0'
x_route_from_xfer='0'
x_route_to_xfer='0'
x_reply_by_xfer='0'
x_reply_to_xfer='0'
x_routed_to_XIB='N'
x_end_xfer_script=''
x_ftp_command=''
"
# or assign "transfer" with a output of other command.

while read -r line; do
    eval "$line"
done < <(
awk -F= 'BEGIN {
    a["x_snd_appli"] = "Application"
    a["x_route_from_xfer"] = "Route"
    a["x_ftp_command"] = "Command"
    }
    a[$1] {print a[$1] "=" $2}
' <<< "$transfer"
)

echo "Application=$Application"
echo "Route=$Route"
echo "Command=$Command"

Мы должны уделять больше внимания при использовании eval, как упоминают другие.

0 голосов
/ 21 декабря 2018

То, что у вас уже есть, является действующим сценарием оболочки.Вы можете просто получить его:

$ source ./file
$ echo $x_dup_from_xfer
0

Чтобы переназначить, может помочь маленький sed / awk, например:

$ eval $(sed -n 's/^x_route_from_xfer=/Route=/p' file)
$ echo $Route
0

-n отключает автоматическую печать строк и s replacetes, p печатает результат замещения.Несколько команд sed:

$ eval $(sed -n 's/^x_route_from_xfer=/Route=/p;s/.../.../p' file)

Тем не менее, позаботьтесь о том, чтобы этот источник и eval требовали, чтобы вы контролировали содержимое файла.

Входные данные также могут поступать из переменной:

eval $(sed ... <<< "$var")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...