2012-01-21 19 views
13

Chciałbym pobrać strony internetowe podczas dostarczania adresów URL ze standardowego wejścia. Zasadniczo jeden proces ciągle generuje adresy URL do stdout/file i chcę je potokować wget lub curl. (Pomyśl o tym, jako prostym robocie indeksującym, jeśli chcesz).wget lub curl ze stdin

To wydaje się działać prawidłowo:

tail 1.log | wget -i - -O - -q 

Ale gdy używam '-f' ogon i to już nie działa (buforowanie lub wget czeka na EOF):

tail -f 1.log | wget -i - -O - -q 

Czy ktokolwiek mógłby zaproponować rozwiązanie za pomocą wget, curl lub jakiegokolwiek innego standardowego narzędzia Unix? Najlepiej, jeśli nie będę chciał ponownie uruchamiać wget w pętli, po prostu utrzymuj go przy pobieraniu adresów URL, gdy nadejdą.

Odpowiedz

6

Należy użyć xargs. Na przykład.

tail -f 1.log | xargs -n1 wget -O - -q 
+0

Z 'xargs'' wget' otrzymuje adres URL jako parametr, więc nie potrzebujesz już '-i -'. 'tail -f 1.log | xargs -n1 wget -O - -q' – pabouk

+0

to rozpocznie nowy proces wget na adres URL –

+0

Jeśli działa na współdzielonej maszynie, możesz chcieć wiedzieć, że każdy inny użytkownik może odczytać twoje parametry za pomocą komendy "ps", więc nie umieszczaj haseł itp. w swoich adresach URL. Użyj jednego z rozwiązań, które nie wymagają obrócenia stdin na parametry, jeśli to może być problem (administratorzy z dostępem roota do komputera mogą oczywiście nadal sprawdzać, które adresy URL pobierasz, ale prawdopodobnie ufasz administratorom bardziej niż ufasz losowo inni użytkownicy). –

0

Użyj xargs, który konwertuje stdin na argument.

tail 1.log | xargs -L 1 wget 
+0

Skomentowałem inną odpowiedź: jeśli działa na współdzielonej maszynie, możesz chcieć wiedzieć, że każdy inny użytkownik może odczytać twoje parametry za pomocą polecenia "ps", więc nie umieszczaj haseł itp. W swoich adresach URL . Użyj jednego z rozwiązań, które nie wymagają obrócenia stdin na parametry, jeśli to może być problem (administratorzy z dostępem roota do komputera mogą oczywiście nadal sprawdzać, które adresy URL pobierasz, ale prawdopodobnie ufasz administratorom bardziej niż ufasz losowo inni użytkownicy). –

3

Można to zrobić za pomocą cURL, ale dane wejściowe muszą być odpowiednio sformatowane. Przykład alfa.txt:

url example.com 
output example.htm 
url stackoverflow.com 
output stackoverflow.htm 

Alternatywny przykład:

url stackoverflow.com/questions 
remote-name 
url stackoverflow.com/documentation 
remote-name 

Przykładowe polecenie:

cat alfa.txt | curl -K- 
+0

Linie "output" lub "remote-name" są opcjonalne: pomiń je, jeśli chcesz, aby wyjście przechodziło na standardowe wyjście.Wystarczy więc dodać "url" na początku każdego wiersza (np. Pipe via sed -e 's/^/url /'). –

+0

Problem z buforowaniem OP nadal będzie problemem. curl's -K- nie ładuje swojego wejścia po jednej linii naraz. –

0

Spróbuj potokiem tail -f poprzez python -c $'import pycurl;c=pycurl.Curl()\nwhile True: c.setopt(pycurl.URL,raw_input().strip()),c.perform()'

dostaje to curl (dobrze, prawdopodobnie oznaczało zwijanie wiersza poleceń i nazywam to biblioteką z jednej linijki Pythona, ale wciąż jest zwinięta), aby natychmiast pobrać każdy adres URL, jednocześnie korzystając z możliwości pozostawienia gniazda na serwerze otwartym, jeśli żądasz wielu adresów URL z tego samego serwera kolejno. Nie jest to jednak całkowicie niezawodny: jeśli jeden z adresów URL jest duff, całe polecenie zakończy się niepowodzeniem (możesz chcieć uczynić go odpowiednim skryptem w języku Python i dodać do niego obsługę), i jest też mały detal, który będzie rzutował EOFError na EOF (ale zakładam, że to nie jest ważne, jeśli używasz tail -f).

Powiązane problemy