Как я делаю вывод для сбоя grep?

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

grep -rl 'regex' . |
while read -r file; do
    stat -c '%Y:%n' "$file"
done | sort | cut -d: -f2-

Это, очевидно, повредится, если у Вас будут имена файлов с новыми строками на их именах или чем-то.

3
12.01.2015, 21:18
3 ответа
  • Добавьте пробел после [ (это команда)
  • Используйте -n для проверки, является ли длина строки ненулевой, или -z для проверки, является ли она нулевой
  • Поместите двойные кавычки вокруг переменных

Итак:

read finding

if [ -z "$finding" ]; then
    echo "You didn't enter anything"
else
    grep "$finding" information.txt
    if [ ! "$?" -eq 0 ]; then
        echo "No such information in database."
    fi
fi
5
27.01.2020, 21:11
i=0
until  [ "$((i+=1))" -gt 5 ] || {
       printf '\nPrompt: '
       read finding && [ -n "$finding" ]
};do   printf '\nINVALID:\tTry again.\n'
done   <>/dev/tty >&0
grep -- "${finding:?INSUFFICIENT INPUT!}" <info.txt ||
! printf '%s:\tNot found in database.' "$finding" >&2

Вы должны проверить не только то, что $finding не является нулевым, но и то, что read успешно завершается - и поэтому настройка его в первую очередь. В описанном выше цикле перед выходом из состояния w/ error 5 раз будет запрошена и попытка прочитать из терминала строку с не нулевым входным сигналом.

  • "${расширение:?SUBSTITUTE ONLY IF UNSET OR NULL! >STDERR}"
    • Пустое значение для $finding обрабатывается как побочный эффект параметра ${${:?expansion} и приводит к сообщению, записанному на stderr и немедленному выходу из неинтерактивной оболочки.
  • cmd ...
    • Это синтаксическая ошибка - попытка перенаправления из файла, который не может быть открыт (например, из файла, который не существует или для которого действующий UID/GID не имеет разрешений на чтение), и поэтому если info.txt по каким-либо причинам является недействительным, неинтерактивная оболочка записывает диагностическое сообщение на stderr и также немедленно выходит из него. Это также верно, если попытка прочитать превышает ограничения, установленные в ulimit - и одинаково применимо к начальному циклу до ... выполнения <>в >&out.
  • grep ... || ! printf '%s: fmt' "$param"
    • Поскольку любые ошибки пользовательского или файлового ввода уже приводили к выходу оболочки до вызова grep, единственные два возможных результата вышеуказанной формы - это то, что grep хотя бы один раз совпадает с шаблоном в "$finding" и записывает соответствующие строки в stdout или что он не совпадает даже один раз и возвращает значение, отличное от 0. В последнем случае printf записывает информационное сообщение на stderr и возвращает 1.
0
27.01.2020, 21:11

Использование некоторых логических операторов (Начиная с @jimmij)

grep -q "$finding" information.txt ведет себя как логический ответ (ничто не печатается со статусом возврата 0, если найдено, в противном случае ненулевым).

grep -F -- "$finding" ... ищите текст вместо regexp (удалите его, если хотите. для поиска регэкспо... могут быть некоторые риски безопасности... (спасибо @StephanChazelas))

read finding

if [ -z "$finding" ]; then
   echo "You didn't enter anything"
else
   grep -qF -- "$finding" information.txt   && echo "found"   || echo "not found"
fi

или даже

[ -z "$finding" ] && 
     echo "nothing entered" || 
     grep -qF -- "$finding" information.txt || echo "not found"

(хотя будьте осторожны, он также будет запускать второй grep и/или echo, если первое echo не удается)

Edit 1 > объяснить grep -q ... Конечно.

В нормальных ситуациях статус grep return равен 0 (и просто возвращает "не 0", если произошла ошибка (например, файл не найден))

grep -qF exp file "возвращает" 0, если находит exp в файле, ошибка в противном случае (grep -q exp file сделал бы это, если бы регенерация exp была бы совпадена в файле ).

Это поведение может быть использовано в управляющих операторах bash (if,elif, while, &&, ||,etc)

read f

if [ -z "$f" ]; then
   echo "You didn't enter anything"
elif grep -qF -- "$f" information.txt; then
   echo "found"
else
   echo "not found"
fi
3
27.01.2020, 21:11

Теги

Похожие вопросы