Поиск нескольких строк в сценариях оболочки

Я пытаюсь найти строки Error:, Error :, ERROR:, ERROR : в заданном файле, если они найдены, перейдите к блоку if, если не найдены, перейдите к блоку else.

Ниже приведена логика, которую я написал для выполнения этой операции.

#!/bin/bash
file='file.log'
text=`cat $file`
echo $text
if [[ ${text} = *Error:* ||${text} = *ERROR:*|| ${text} = *ERROR :* || ${text} = *Error :* || $? -ne 0 ]]; then
  STATUS=1
  echo "=> string found." 
else
  echo "=> no string found." 
fi

Похоже, у этой логики есть проблемы, поскольку она возвращает ошибку ниже.

syntax error near `:*'

Может ли кто-нибудь помочь мне в решении этой проблемы?

Почему бы и нет grep -iq 'error \{0,1\}:' file.log?

Biffen 09.05.2022 12:58

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

Jennie 09.05.2022 13:03

if ( grep -iq 'ошибка \{0,1\}:' $value || $? -ne 0; ) ; затем STATUS=1 echo "=> найденная строка." else echo "=> Строка не найдена." фи

Jennie 09.05.2022 13:07

все еще собирается блокировать else, хотя строка существует

Jennie 09.05.2022 13:10
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
0
4
25
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это проще сделать, используя grep, используя -i для совпадения без учета регистра и -q для подавления вывода:

#!/bin/bash
file='file.log'
if grep -iq 'error \?:' "$file"; then
  STATUS=1
  echo "=> string found." 
else
  echo "=> no string found." 
fi

Регулярное выражение error ?: означает: текст error, за которым следует необязательный пробел (обозначается \? после пробела), за которым следует :.

спасибо, Томас, хотя я обновил свою логику, она все еще будет блокироваться.

Jennie 09.05.2022 13:16

Извините, пропустил обратную косую черту, исправлено (и протестировано :)).

Thomas 10.05.2022 08:56
Ответ принят как подходящий

Шаблон, который вы ищете, легко выражается в регулярном выражении, поэтому вы можете просто использовать grep:

#!/bin/bash

file='file.log'

if grep -iq 'error \{0,1\}:' "${file}"
then
  STATUS=1
  echo "=> string found." 
else
  echo "=> no string found." 
fi

Нет необходимости читать весь файл в переменную или явно проверять $?.

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