Bash добавить значения регулярных выражений в массив - PullRequest
0 голосов
/ 14 ноября 2018

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

В качестве первого шага я написал скриптэто добавляет все строки в файле журнала в массив и отображает их.Затем я попытался отредактировать этот скрипт для поиска регулярного выражения в файле журнала, в котором я получил огромное количество ошибок.

То, что я пытаюсь сделать, это взять значение в скобках файла журнала.Некоторые строки в файле журнала содержат синтаксис, например [23423234 с], который является отметкой времени.Я хочу получить значения (цифры, пробел и "s") в скобках (но не в скобках!) И добавить эти значения в массив.

Мой начальный скрипт приведен ниже:

#!/bin/bash

echo "STARTING SCRIPT"

getArray(){
        array=()
        while IFS= read -r line
        do
                array+=("$line")
        done <"$1"
}

getArray "testlog.txt"
for e in "${array[@]}"
do
        echo "$e"
done

echo "DONE SCRIPT"

Журнал, на который я смотрю, выглядит следующим образом:

[1542053213 s] Starting Program:
-----------------------------------------
[1542053213 s] PROGRAM ERROR
ERRHAND: 1033
ERRHAND: 233545
ERRHAND: 1
[1542053213 s] Program completed!

[1542053213 s] Config File complete. Stopping!

Я хочу сделать что-то со следующим псевдокодом:

For each line in file{
regex = [\d\ws]


    if line matches regex{
        add to array
    }
}

for each item in array{
    echo item
}

В настоящее времяЯ отредактировал свой сценарий так, как показано ниже:

#!/bin/bash

echo "STARTING SCRIPT"

getArray(){
    array=()
    while IFS= read -r line
    do
        if [[$line =~ [\d\ws]; then
        array+=("$line");
        fi
    done <"$1"  
}

getArray "log.txt"
for e in "${array[@]}"
do
    echo "$e"
done

echo "DONE SCRIPT"

Но всякий раз, когда я запускаю его, я получаю следующий набор ошибок:

[jm@local Home]$ ./Parser.sh 
STARTING SCRIPT
./Parser.sh: line 9: [[[1542053213: command not found
./Parser.sh: line 9: [[-----------------------------------------: command not found
./Parser.sh: line 9: [[[1542053213: command not found
./Parser.sh: line 9: [[ERRHAND:: command not found
./Parser.sh: line 9: [[ERRHAND:: command not found
./Parser.sh: line 9: [[ERRHAND:: command not found
./Parser.sh: line 9: [[[1542053213: command not found
./Parser.sh: line 9: [[: command not found
./Parser.sh: line 9: [[[1542053213: command not found
DONE SCRIPT

Любой совет будет принят с благодарностью.Я пытался просмотреть другие сообщения, но ни один из них не смог реально решить мою проблему, которая заключается в создании правильного регулярного выражения для шаблона [2342323 s], а затем добавлении его в массив.Тиа

1 Ответ

0 голосов
/ 14 ноября 2018

Как указано в комментариях

  • if [[ отсутствует его закрытие ]].
  • В регулярном выражении [ не является литералом, но начинает символгруппа.Чтобы сопоставить что-то вроде [1234 s], вы должны написать \[[0-9]* s\].

Чтобы извлечь только число 1234 из \[1234 s\], вы можете использовать tr, sed, perl -Pили секунда grep -o.

В целом, ваш скрипт кажется слишком сложным.Вы можете существенно упростить это.Замените цикл for на mapfile и используйте grep -o для извлечения совпадений.Вы можете заменить весь сценарий следующим:

mapfile -t array < <(grep -o '\[[0-9]* s\]' logfile | tr -d '[] s')
printf '%s\n' "${array[@]}"

Обратите внимание, что если вы хотите печатать только совпадения, вам не нужен массив.Достаточно будет только части grep:

grep -o '\[[0-9]* s\]' logfile | tr -d '[] s'
...