Получение пустого файла для вывода grep - PullRequest
0 голосов
/ 10 февраля 2012

Я запускаю эту команду в сценарии

while [ 1 ]
do

    if [ -e $LOG ]
    then

            grep -A 5 -B 5 -f $PATTERNS $LOG  >> $FOREMAIL
            break
    fi

done

$ LOG файл scp'ed с другого компьютера. Поэтому, как только он появится в текущем каталоге, цикл обнаружит его и выполнит команду grep. Проблема в том, что файл $ FOREMAIL оказывается пустым. Но если я запускаю этот grep вне скрипта как отдельную команду с теми же файлами и параметрами, я вижу, что он генерирует вывод.

Я озадачен тем, почему эта команда не генерирует o / p в скрипте?

Ответы [ 5 ]

5 голосов
/ 10 февраля 2012

-e запускается, как только scp создает файл, в то время как в нем все еще нет данных, а grep работает с пустым файлом.Вам нужно подождать, пока файл не завершит передачу.

Вы можете сделать это, перейдя во временное имя файла, чем запустив mv через ssh с компьютера, который отправляет файл вверх.

Редактировать: код для копирования машины в файл журнала ...

scp $log 192.168.0.1:/logfiles/${log}.tmp
ssh 192.168.0.1 mv /logfiles/${log}.tmp /logfiles/${log}
2 голосов
/ 10 февраля 2012

Прежде чем вы сможете выполнить grep, вам нужно подождать две вещи: 1) загрузка началась (файл появляется) и 2) загрузка завершена (никто больше не открывает файл).У меня есть скрипт вызова waitfor.sh, который делает это:

#!/bin/bash

# waitfor.sh - wait for a file fully downloaded (via Firefox, scp, ...)
# Syntax:
#   waitfor.sh filename

FILENAME=$1 # Name of file to wait for
INTERVAL=10 # Wait interval of N seconds

# Wait for download started
while [ ! -f $FILENAME ] 
do
    sleep $INTERVAL
done

# Wait for download finished
while lsof $FILENAME
do
    sleep $INTERVAL
done

Чтобы использовать его:

waitfor.sh $LOG
grep ...
1 голос
/ 10 февраля 2012

Может ли быть так, что while [1] очень быстро, поэтому, когда файл начинает копирование, он отображается как пустой файл, прежде чем копирование завершится?В зависимости от размера файла, попробуйте задержку сна в цикле then.Выяснение того, когда файл заканчивает копирование, когда выполняется внешним процессом, вероятно, является отдельным вопросом - например, поиск в поиске чего-то вроде «как узнать, когда scp закончил копирование файла», выдает кучу ссылок, таких как: https://superuser.com/questions/45224/is-there-a-way-to-tell-if-a-file-is-done-copying

0 голосов
/ 10 февраля 2012

Вот что я закончил:

scp $ LOGFILE

затем

scp $ SCPDONE # пустой файл

И изменил условие if следующим образомэто:

while [ 1 ]
do

    if [ -e $SCPDONE ]
    then

        grep -A 5 -B 5 -f $PATTERNS $LOG  >> $FOREMAIL
        break
    fi

done
0 голосов
/ 10 февраля 2012

Лучше использовать:

if [ -f $LOG ]

вместо:

if [ -e $LOG ]
  • -f проверяет обычный тип
  • -e проверяет любой файл
...