Сплит строка с |символ в Bash и экспорт переменных среды из первой строки - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть следующая строка, которую я получаю от веб-службы:

user@server:~# cat test.txt
account|uname|upass|mac|ip|tariff|download|upload
11122|24a43cda22b2|O3v2L2oPE9|24:A4:3C:DA:22:B2|192.168.1.2|7|12582500|2097000

Первая строка - это имена столбцов, а вторая - их соответствующие значения.Обратите внимание, что ответ всегда возвращает эти две строки, не более.Я не могу использовать JSON или другой структурированный формат ответа, и именно с этим я должен работать.

Моя цель - разделить все эти значения по их символу-разделителю | и установить переменные среды (или переменные вконтекст моего .sh сценария) с использованием имен столбцов в качестве имен переменных.

До сих пор я мог разделить обе строки с | по отдельности, используя следующую команду:

user@server:~# head -n1 test.txt | sed 's/|/\n/g'
account
uname
upass
mac
ip
tariff
download
upload

user@server:~# head -n2 test.txt | sed 's/|/\n/g'
11122
24a43cda22b2
O3v2L2oPE9
24:A4:3C:DA:22:B2
192.168.1.2
7
12582500
2097000

Отсюда я бы хотел определить переменные, т.е.$account, $uname и т. Д. Иметь значения:

$account = 11122
$uname = 24a43cda22b2

Чтобы иметь их в качестве системных переменных среды (до перезагрузки или следующего выполнения моего .sh сценария) или в контексте самого сценария оболочки.

Ответы [ 4 ]

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

Использование пасты и GNU sed:

. <(paste -d= <(sed -n '1s/|/\n/gp' test.txt) <(sed -n '2s/|/\n/gp' test.txt))

Или, если доступна GNU datamash:

. <(datamash -t '|' --output-delimiter='=' transpose < test.txt)

Тогда:

echo $account $mac $ip

Будет выводиться:

11122 24:A4:3C:DA:22:B2 192.168.1.2
0 голосов
/ 10 декабря 2018

Если фиксированные заголовки, достаточно read:

IFS='|' read account uname upass mac ip tariff download upload < <(tail -n1 test.txt)
echo $account $ip

Вывод:

11122 192.168.1.2
0 голосов
/ 10 декабря 2018

дубль 3: awk по запросу

$: awk -F'|'  'BEGIN{ ORS="" }
  NR == 1  { for ( i=0; i <= NF; i++ ) { arr[i] = $i;                  }; }
  NR == 2  { for ( i=1; i <= NF; i++ ) { printf "%s=%s\n", arr[i], $i; }; }
' test.txt > /tmp/vars
$: . /tmp/vars

дубль 2: переписать для sh

Надеюсь, это поможет.:)

$: cat parse
#! /bin/env sh

sed -n '
  s/[|]/\n/g
  1 w /tmp/names
  2 w /tmp/vals
' $1

paste /tmp/names /tmp/vals | sed 's/\t/=/' >/tmp/vars

$: cat /tmp/vars
account=11122
uname=24a43cda22b2
upass=O3v2L2oPE9
mac=24:A4:3C:DA:22:B2
ip=192.168.1.2
tariff=7
download=12582500
upload=2097000

$: . /tmp/vars
$: echo $account
11122

Оригинал для справки

printf -v запишет в указанное вами имя переменной.

$: cat parse
#! /bin/env bash

{ IFS='|' read -a headers
  IFS='|' read -a data
} < $1

declare -i ndx=0
for h in "${headers[@]}"
do  printf -v "$h" "%s" "${data[ndx++]}"
done

echo "account=$account uname=$uname upass=$upass mac=$mac ip=$ip tariff=$tariff download=$download upload=$upload"

Выполнено как:

$: parse test.txt >vars

Вывод:

$: cat vars
account=11122 uname=24a43cda22b2 upass=O3v2L2oPE9 mac=24:A4:3C:DA:22:B2 ip=192.168.1.2 tariff=7 download=12582500 upload=2097000

для загрузки этих значений в область действия:

$: parse test.txt >vars
$: . vars

Даже в sh поиск выходных данных должен делать то, что вынеобходимо.

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

Это делает то, что вы хотите:

awk -F'|'  'BEGIN{ ORS="" } { for ( i=1; i<= NF && NR == 1; i++){ arr[i]=$i  } ; if (NR == 1)  next ; for ( i=1; i<= NF ; i++ ) { print arr[i]"="'\''$i'\''"\n" } } ' input.txt


account=11122
uname=24a43cda22b2
upass=O3v2L2oPE9
mac=24:A4:3C:DA:22:B2
ip=192.168.1.2
tariff=7
download=12582500
upload=2097000

РЕДАКТИРОВАТЬ: символ доллара не требуется при объявлении.РЕДАКТИРОВАТЬ: Чтобы фактически установить это как переменные окружения, вы можете перенаправить вывод его в файл / etc / environment как здесь:

awk -F'|'  'BEGIN{ ORS="" } { for ( i=1; i<= NF && NR == 1; i++){ arr[i]=$i  } ; if (NR == 1)  next ; for ( i=1; i<= NF ; i++ ) { print arr[i]"="'\''$i'\''"\n" } } ' input.txt >> /etc/environment

Вам нужно sudo, конечно

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...