Получить значения строки, предложения по производительности

У меня есть код в сценариях 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')

Проблема в том, что я выполняю этот код много раз одновременно, и мне нужно улучшить производительность. Знаете ли вы, как изменить код, чтобы улучшить производительность? Спасибо

Обрабатываются ли одновременно несколько входных данных? Какое отношение этот код имеет конкретно к «повышению производительности»? Это общий вопрос о том, как обрабатывать задачи параллельно?

Bohemian 25.04.2024 11:18

Вы запускаете подоболочку для заполнения каждой переменной. В некоторых подоболочках вы запускаете несколько команд в канале. Использование расширения параметров может быть намного быстрее, поскольку оно остается в той же оболочке (но не имеет всех возможностей awk или sed).

choroba 25.04.2024 11:29

Меня смущает line=$(echo $*). Вы вводите одну строку текста или несколько строк текста, как показано в вашем вопросе? Вызывается ли ваш инструмент с этими входными данными в качестве аргументов, как это подразумевается `line=$(echo $*)``, или он читает их из файла или канала? Пожалуйста, отредактируйте свой вопрос, чтобы показать, как называется код, присутствующий в нем в данный момент, поскольку я сильно подозреваю, что это лучший способ сделать ЭТО, а также решить проблему, о которой вы спрашиваете.

Ed Morton 25.04.2024 14:46

Также укажите, всегда ли ваш ввод содержит все эти поля, и если да, то всегда ли они расположены в таком порядке.

Ed Morton 25.04.2024 14:57

ввод (как представлено в вопросе) распределяется по 4 строкам (т. е. данные включают 3 встроенных перевода строки); из-за встроенных переводов строк ваш код на самом деле не работает (например, sb оказывается пустым); Я предполагаю, что ваш ввод на самом деле представляет собой одну длинную строку текста; пожалуйста, обновите вопрос, чтобы подтвердить структуру и формат ввода образца... несколько строк? одна одиночная/длинная линия?

markp-fuso 25.04.2024 15:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо запуска нескольких команд в подоболочке для заполнения каждой переменной используйте расширение параметров. Это происходит в той же оболочке, а значит, гораздо быстрее. Он не такой мощный, как 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

Другие вопросы по теме