У меня есть файл конфигурации, в котором есть токен gitlab с двумя разными значениями для токена. Есть ли способ получить эти значения в одной команде сценария bash. Блокировка однострочной команды для извлечения токена.
concurrent = 10
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab"
limit = 13
url = "gitlab url"
token = "xxxxxxxxxxxxx"
executor = "docker+machine"
[runners.docker]
tls_verify = false
image = "docker:stable"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = true
shm_size = 0
[runners.machine]
IdleCount = 0
IdleTime = 300
MaxBuilds = 600
MachineDriver = "amazonec2"
MachineName = "gitlab-docker-machine-%s"
OffPeakPeriods = ["* * 0-9,17-23 * * mon-fri *", "* * * * * sat,sun *"]
OffPeakTimezone = "Europe/London"
OffPeakIdleCount = 0
OffPeakIdleTime = 30
[[runners]]
name = "gitlab"
limit = 11
url = "gitlab url"
token = "yyyyyyyyyyyyyyyyyyy"
executor = "docker+machine"
[runners.docker]
tls_verify = false
image = "docker:stable"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = true
shm_size = 0
Я думаю, что это возможно с помощью следующей команды.
awk -F' = ' '/token/ {print $2}' config.txt | sed -n 1p
ИЛИ
awk -F' = ' '/token/ {print $2}' config.txt | sed -n 2p
ИЛИ
awk -F' = ' '/token/ {print $2}' config.txt | awk 'NR==1'
ИЛИ
awk -F' = ' '/token/ {print $2}' config.txt | awk 'NR==2'
ИМХО, это можно было сделать и в сингле awk
см. один раз stackoverflow.com/a/55578745/5866580
awk -F" = " '/token/ && NR == 1 { print $2 }'
; зачем иметь два отдельных экземпляра, когда вы можете просто иметь два условия?
Вы можете использовать grep, чтобы изолировать строки, содержащие токен:
cat test | grep token'
Если вам нужен только сам токен без "token =", добавьте awk:
cat test | grep token | awk '{print $3}'
И если вы хотите получить только строку токена без символа ", добавьте tr:
cat test | grep token | awk '{print $3}' | tr -d \"
ИМХО, это можно было сделать и в сингле awk
, см. один раз stackoverflow.com/a/55578745/5866580
Конвейеры имеют снижение производительности, особенно при работе с достаточно небольшими объемами данных, когда затраты на запуск являются значительными в процентах от общего времени выполнения. Когда вы запускаете grep -e token test
или grep -e token <test
, grep
имеет прямой дескриптор файла test
; когда вы запускаете cat test | grep -e token
, файл test
сначала читается одной программой (cat
), записывается на ее стандартный вывод, читается второй программой (grep
) на стандартный ввод, записывается на стандартный вывод этой программы — все это не бесплатно.
...при условии, что по крайней мере для cat
и grep
этот штраф довольно незначителен; с другой стороны, cat foo | tail
должен прочитать все foo
(даже если это несколько ГБ или ТБ данных), тогда как tail foo
или tail <foo
можно сразу перейти к концу. Точно так же sort <foo
может распараллеливать, разветвляясь на подпроцессы или потоки, которые параллельно сортируют разные подразделы файла, а затем выполняют сортировку слиянием для объединения их результатов; но cat foo | sort
может читать только от начала до конца.
Это можно сделать одним awk
более общим способом. Я добавил здесь переменную с именем occur
, где мы можем указать, например, какое значение вхождения мы хотим напечатать.
awk -v occur = "2" -F' = ' '/token/{if (++count==occur){print}}' config.txt
В этом случае он будет печатать значение только для второго поля токена строки (второе вхождение).
Можно изменить значение occur
и вывести значение токена этой строки.
Обновлено: Чтобы сделать его более быстрым с точки зрения обработки, я также добавляю exit
в свой код, что заставит awk-программу выйти как можно скорее, если она найдет совпадающую строку совпадающего вхождения.
awk -v occur = "2" -F' = ' '/token/{if (++count==occur){print;exit}}' config.txt
@Prasad Ligade, не могли бы вы попробовать это решение один раз и сообщить мне, поможет ли оно вам?
Вы собираетесь получить два токена в двух отдельных переменных?