Поиск подстроки в последней строке файла

Я пишу скрипт который из всех файлов по заданной маске должен определить является ли последняя строка файла "Incorrect volume"

#!/bin/sh

f=`find -name \*-volume.log`

for file in $f
do
out = `tail -n 1 ${file#*./}`
echo $out
if [$out = "Incorrect volume" ]
then
echo "Privet"
fi
echo ${file#*./}
done

Я написал такой код но он не считывает переменную out почему-то а также не принимает условие сравнения строк. Помогите разобраться в ошибке.


Ответы (2 шт):

Автор решения: karaname

example

if [ "$(cat file.txt | grep "Incorrect volume" )"]; then
 echo y
else
 echo n
fi
→ Ссылка
Автор решения: aleksandr barakin

вообще у вас две синтаксические ошибки:

  1. вокруг символа = в операторе присвоения не должно быть пробелов:

    out=...
    
  2. [ — это имя программы. да, часто используется внутренняя реализация в интерпретаторе, но синтаксис надо соблюдать. между именем программы и первым аргументом должен быть пробел:

    [ аргумент ...
    

и пара недочётов:

  1. строка может содержать пробел, потому в операторе сравнения её надо заключать в кавычки:

    [ "$out" = "..." ]
    
  2. если ни одно из имён найденных файлов не может содержать пробела, то всё нормально, а вот если может, вам надо в корне менять весь скрипт (особенно с учётом того, что вы требуете (в шебанге) именно posix-совместимого, т.е., довольно примитивного поведения).


а вообще программа для интерпретатора awk, проверяющая наличие паттерна в последней строке файла, будет значительно компактнее:

$ awk 'END{if(/паттерн/)print FILENAME}' файл

если её дополнить вызовом программы find, то получим требуемый поиск:

$ find -name \*-volume.log -exec awk 'END{if(/паттерн/)print FILENAME}' {} \;
→ Ссылка