У меня есть код в сценариях bash для извлечения некоторых значений из переменных. Текст:
ct: I al: 3669619 dc: SERVERA mn: CAR or: 19qrh sv: R st: Not_Noticed stt: 2024
0411151219 lu: lt: ms: THAT'S MESAGE run_as: USER sb
: TRADE ap: APPLICATION. jb: JDFSSS ho: HOSTA al: R closed_from_em: nb:
cn: 00000000001
Текст — это ловушка, которая отправляется в скрипт, поэтому вся строка передается как аргумент.
Мой код:
line=$(echo $*)
jo=$(echo $* | awk '{print $6":"$9}')
dc=$(echo $* | awk '{print $6}')
aid=$(echo $* | sed 's/.* al:\(.*\) dc.*/\1/' | sed 's/^ //g')
or=$(echo $* | sed 's/.* or:\(.*\) sv.*/\1/' | sed 's/^ //g')
jb=$(echo $* | sed 's/.* jb:\(.*\) ho.*/\1/' | sed 's/^ //g')
ms=$(echo $* | sed 's/.* ms:\(.*\) run_as.*/\1/' | sed 's/^ //g')
callType=$(echo $* | sed 's/ct:\(.*\) al.*/\1/' | sed 's/^ //g')
sv=$(echo $* | sed 's/.* sv:\(.*\) st.*/\1/' | sed 's/^ //g')
st=$(echo $* | sed 's/.* st:\(.*\) stt.*/\1/'| sed 's/^ //g')
sendTime=$(echo $* | sed 's/.* stt:\(.*\) lu.*/\1/' | sed 's/^ //g')
ru=$(echo $* | sed 's/.* run_as:\(.*\) sb.*/\1/' | sed 's/^ //g')
sb=$(echo $* | sed 's/.* sb:\(.*\) ap.*/\1/' | sed 's/^ //g')
ap=$(echo $* | sed 's/.* ap:\(.*\) jb.*/\1/' | sed 's/^ //g')
ho=$(echo $* | sed 's/.* ho:\(.*\) al.*/\1/' | sed 's/^ //g')
al=$(echo $* | sed 's/.* al:\(.*\) closed_from.*/\1/' | sed 's/^ //g')
Проблема в том, что я выполняю этот код много раз одновременно, и мне нужно улучшить производительность. Знаете ли вы, как изменить код, чтобы улучшить производительность? Спасибо
Вы запускаете подоболочку для заполнения каждой переменной. В некоторых подоболочках вы запускаете несколько команд в канале. Использование расширения параметров может быть намного быстрее, поскольку оно остается в той же оболочке (но не имеет всех возможностей awk
или sed
).
Меня смущает line=$(echo $*)
. Вы вводите одну строку текста или несколько строк текста, как показано в вашем вопросе? Вызывается ли ваш инструмент с этими входными данными в качестве аргументов, как это подразумевается `line=$(echo $*)``, или он читает их из файла или канала? Пожалуйста, отредактируйте свой вопрос, чтобы показать, как называется код, присутствующий в нем в данный момент, поскольку я сильно подозреваю, что это лучший способ сделать ЭТО, а также решить проблему, о которой вы спрашиваете.
Также укажите, всегда ли ваш ввод содержит все эти поля, и если да, то всегда ли они расположены в таком порядке.
ввод (как представлено в вопросе) распределяется по 4 строкам (т. е. данные включают 3 встроенных перевода строки); из-за встроенных переводов строк ваш код на самом деле не работает (например, sb
оказывается пустым); Я предполагаю, что ваш ввод на самом деле представляет собой одну длинную строку текста; пожалуйста, обновите вопрос, чтобы подтвердить структуру и формат ввода образца... несколько строк? одна одиночная/длинная линия?
Вместо запуска нескольких команд в подоболочке для заполнения каждой переменной используйте расширение параметров. Это происходит в той же оболочке, а значит, гораздо быстрее. Он не такой мощный, как sed
или awk
, но, к счастью, здесь он вам не понадобится:
#! /bin/bash
while read line ; do
set -- $line
jo=$6:$9
dc=$6
aid=${line#* al: }; aid=${aid% dc:*}
or=${line#* or: }; or=${or% sv:*}
jb=${line#* jb: }; jb=${jb% ho:*}
ms=${line#* ms: }; ms=${ms% run_as*}
callType=${line#ct: }; callType=${callType%% al:*}
sv=${line#* sv: }; sv=${sv% st:*}
st=${line#* st: }; st=${st% stt:*}
sendTime=${line#* stt: }; sendTime=${sendTime% lu:*}
ru=${line#* run_as: }; ru=${ru% sb:*}
sb=${line#* sb: }; sb=${sb% ap:*}
ap=${line#* ap: }; ap=${ap% jb:*}
ho=${line#* ho: }; ho=${ho% al:*}
al=${line##* al: }; al=${al% closed_from*}
echo "JO: $jo."
echo "DC: $dc."
echo "AID: $aid."
echo "OR: $or."
echo "JB :$jb."
echo "MS: $ms."
echo "CALLTYPE: $callType."
echo "SV: $sv."
echo "ST: $st."
echo "SENDTIME: $sendTime."
echo "RU: $ru."
echo "SB: $sb."
echo "AP: $ap."
echo "HO: $ho."
echo "AL: $al."
done
Обрабатываются ли одновременно несколько входных данных? Какое отношение этот код имеет конкретно к «повышению производительности»? Это общий вопрос о том, как обрабатывать задачи параллельно?