Как искать несколько подстрок в строке - PullRequest
0 голосов
/ 13 марта 2020

Я новичок в bash программировании, и я пытался написать функцию для поиска нескольких подстрок в строке для анализа журнала.

Например: у меня есть файл журнала, который содержит следующую строку:

"01-01-2020 STREETNEW Функция Триггерная команда 3 обработана - Создана новая улица."

Теперь я хочу найти 2 подстроки в этой строке. Первая подстрока, которую я ищу, это «Команда 3», чтобы определить, какое действие было инициировано. Если «Команда 3» найдена, я хочу найти вторую подстроку «Новая улица создана», чтобы проверить вывод инициированного действия.

До сих пор я написал функцию содержимого, которая помогает мне найти соответствует, и это работает отлично до сих пор. Проблема в том, что эта функция может найти совпадение только для одной подстроки.

Моя функция выглядит следующим образом:

    declare -a arrayLog               # This Array contains my Log-File line per line
    declare -a arrayCodeNumber        # Containing the code numbers, e.g. "Command 3"
    declare -a arrayActionTriggered   # Containing the result of the triggered action, e.g. "New street created"

    #[... build arrays etc...]

    function contains() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
    shopt -s nocasematch
    [[ "${!i}" =~ "${value^^}" ]] && echo "y;$i" || echo "n;$i"
    }
    }
#I'm calling the function like this in a for-loop:
contains "${arrayLog[@]}" "${arrayCodeNumber[i]}"


    #[... processing function results ...]

Моя функция возвращает "y; $ i" или "n; $ ​​i", чтобы указать, было ли совпадение и в какой строке В файле журнала найдено совпадение - этот вывод мне понадобится для обработки результатов сопоставления позже в моем коде.

К сожалению, я не знаю, как расширить или улучшить мою функцию для поиска нескольких подстрок в строке .

Что бы я сделал, чтобы расширить функцию для приема 2 входных массивов (для моего параметра сопоставления) и 1 массива журналов, а также для расширения процесса сопоставления?

Заранее большое спасибо!

С уважением, Тоби

1 Ответ

0 голосов
/ 13 марта 2020

Рассмотрим этот подход

#!/bin/bash

cmd=('Command 2'        'Command 3')
act=('Street destroyed' 'New street created')

for i in ${!cmd[@]}; {
    grep -no "${cmd[$i]}.*${act[$i]}" file
}

Использование

$ ./test
2:Command 2 processed - Street destroyed
1:Command 3 processed - New street created

Из grep справка

$ grep --help
  ...
  -o, --only-matching       show only the part of a line matching PATTERN
  -n, --line-number         print line number with output lines
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...