/ / Pobieranie pustego pliku dla wyjścia grep - linux, bash, grep, scp

Pobieranie pustego pliku dla wyjścia grep - linux, bash, grep, scp

Używam tego polecenia w skrypcie

while [ 1 ]
do

if [ -e $LOG ]
then

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

done

Plik $ LOG jest scp "ed z innego komputera. Tak więc, gdy tylko pojawi się w bieżącym katalogu, pętla wykrywa go i robi grep. Problem polega na tym, że plik $ FOREMAIL okazuje się pusty. Ale jeśli uruchomię grep poza skryptem jako samodzielne polecenie z tymi samymi plikami i parametrami, widzę, że generuje wynik.

Jestem zaskoczony, dlaczego to polecenie nie generuje o / p w skrypcie?

Odpowiedzi:

5 dla odpowiedzi № 1

Znak -e uruchamia się, jak tylko SCP tworzy plik, podczas gdy wciąż nie ma w nim żadnych danych, a grep działa na pustym pliku. Musisz poczekać, aż plik zakończy przesyłanie.

Można to osiągnąć poprzez przeniesienie do tymczasowej nazwy pliku, niż uruchomienie mv przez ssh z maszyny, która przesuwa plik.

Edytuj: kod maszyny do kopiowania do pliku logu ...

scp $log 192.168.0.1:/logfiles/${log}.tmp
ssh 192.168.0.1 mv /logfiles/${log}.tmp /logfiles/${log}

2 dla odpowiedzi nr 2

Zanim zaczniesz grep, musisz poczekać na dwarzeczy: 1) pobieranie rozpoczęło się (plik powstaje) i 2) pobieranie zostało zakończone (nikt już nie otwiera pliku). Mam wywołanie skryptowe waitfor.sh, które to robi:

#!/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

Aby go użyć:

waitfor.sh $LOG
grep ...

1 dla odpowiedzi nr 3

Czy to możliwe, że chwila [1] jest bardzo szybka, więckiedy plik zaczyna się kopiować, pojawia się jako pusty plik przed zakończeniem kopiowania? W zależności od rozmiaru pliku spróbuj opóźnienia snu wewnątrz pętli. Ustalenie, kiedy plik kończy się kopiowanie, gdy jest wykonywane przez proces zewnętrzny, jest prawdopodobnie oddzielnym pytaniem - np. Googling dla czegoś takiego jak "jak powiedzieć, kiedy scp ma finshed kopiowanie pliku" pojawia się kilka linków takich jak: https://superuser.com/questions/45224/is-there-a-way-to-tell-if-a-file-is-done-copying


0 dla odpowiedzi nr 4

Lepiej używać:

if [ -f $LOG ]

zamiast:

if [ -e $LOG ]
  • -f sprawdza typ zwykły
  • -e sprawdza dowolny plik

0 dla odpowiedzi № 5

Oto, co zrobiłem:

scp $ LOGFILE

następnie

scp $ SCPDONE # empty file

Zmodyfikowaliśmy klauzulę: tak:

while [ 1 ]
do

if [ -e $SCPDONE ]
then

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

done