[Gelöst!] Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

[Gelöst!] Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von desputin » 04.03.2022 21:22:45

Hallo Ihr,

ich habe einen Befehl, der immer wieder ausgeführt wird für jede URL, die in der Datei PDF_URLs.txt in jeder Zeile steht:

Code: Alles auswählen

wget -PDF_URLs.txt -w 15 -U wort1
Und ich habe eine Datei, sagen wir wörter.txt, die so aussieht:

Code: Alles auswählen

wort1
wort2
wort3
wort4
wort5
usw.

Wie kann ich den wget-Befehl so immer wieder ausführen, daß er wort1 jedes Mal mit einem anderen wort aus der wörter.txt ersetzt?

Viele Grüße desputin
Zuletzt geändert von desputin am 07.03.2022 01:04:36, insgesamt 1-mal geändert.
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Benutzeravatar
Meillo
Moderator
Beiträge: 8876
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von Meillo » 04.03.2022 22:27:25

Code: Alles auswählen

for i in `cat woerter.txt`; do
    wget -PDF_URLs.txt -w 15 -U "$i"
done
Use ed once in a while!

Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von desputin » 05.03.2022 01:00:35

Hallo Meillo,
super, danke.

Aber kann es sein, daß der cat-Befehl immer nur das erste Wort aus der woerter.txt Datei einsetzt? Ich will ja, daß er hochzählt... Zeile 1 wort1, dann Zeile 2, wort2 usw.
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von eggy » 05.03.2022 01:30:49

Bei solchen Fragen einfach mal nen echo vor den Befehl schreiben, dann bekommst angezeigt, was passieren würde:

Code: Alles auswählen

for i in `cat woerter.txt`; do
    echo wget -PDF_URLs.txt -w 15 -U "$i"
done

Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von desputin » 05.03.2022 21:00:15

Hallo eggy, danke für den Tip! Das Script macht, was es soll
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von desputin » 05.03.2022 21:48:50

Ach ja, noch eine Frage, wenn ich das hier in den Befehl integrieren will, tue ich das am besten vor oder nach dem "done"?

Code: Alles auswählen

sed -i '1d' PDF_URLs.txt
sed -i '1d' woerter.txt
Also ich möchte nach jeder URL, die heruntergeladen wird mit dem Script die jeweils 1. Zeile in den beiden Textdateien gelöscht wird mit dem sed-Befehl.
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von eggy » 06.03.2022 01:02:17

Der Teil zwischen "do" und "done" wird in jedem Durchlauf der Schleife einmal ausgeführt.
Der Teil nach "done" nachdem die Schleife fertig ist.

Auch hier hilft ein echo gut, um zu sehen, was passiert:

Code: Alles auswählen

for i in `cat woerter.txt`; do
    echo wget -PDF_URLs.txt -w 15 -U "$i"
done
echo sed -i '1d' woerter.txt
vs.

Code: Alles auswählen

for i in `cat woerter.txt`; do
    echo wget -PDF_URLs.txt -w 15 -U "$i"
    echo sed -i '1d' woerter.txt
done

Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von desputin » 06.03.2022 01:48:41

Hallo Eggy, alles klar danke!

Hm, aber die Text-Dateien werden durch die Schleife seltsamerweise nicht verändert:

Code: Alles auswählen

for i in `cat woerter.txt`; do
    wget -PDF_URLs.txt -w 15 -U "$i"
    sed -i '1d' woerter.txt
    sed -i '1d' PDF_URLs.txt
done
Woran könnte das liegen?
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

tobo
Beiträge: 2072
Registriert: 10.12.2008 10:51:41

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von tobo » 06.03.2022 02:00:16

desputin hat geschrieben: ↑ zum Beitrag ↑
06.03.2022 01:48:41
Hm, aber die Text-Dateien werden durch die Schleife seltsamerweise nicht verändert:

Code: Alles auswählen

for i in `cat woerter.txt`; do
    wget -PDF_URLs.txt -w 15 -U "$i"
    sed -i '1d' woerter.txt
    sed -i '1d' PDF_URLs.txt
done
Woran könnte das liegen?
Die Schleife initiiert die Schleifenvariable in ihrer Gesamtheit beim ersten Betreten der Schleife. Änderungen an der Datei (woerter.txt) haben danach also keine Lenkwirkung mehr für die Schleife (die Schleifenvariable). Die Dateien ansich werden aber schon verändert - oder existiert die Datei woerter.txt danach etwa noch inhaltlich?

Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von desputin » 06.03.2022 10:53:17

Hallo tobo,
bei mir verändert sich die Datei woerter.txt durch dieses script nicht. Also die erste Zeile bleibt gleich, egal wie viele Runden das Script "dreht"...
Ich hatte aber noch ein Paar Änderungen am Script durchgeführt ganz genau sieht es bei mir so aus:

Code: Alles auswählen

for i in `cat woerter.txt`; do
wget -i PDFs_URLs.txt -w 22 -U "$i" --header="Accept: text/html" --server-response --load-cookies cookiesa.txt
sed -i '1d' woerter.txt
sed -i '1d' PDFs_URLs.txt
done
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

tobo
Beiträge: 2072
Registriert: 10.12.2008 10:51:41

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von tobo » 06.03.2022 12:30:44

Die Dateien "sollten" sich verändern. Wobei das bei woerter.txt - für die Funktionalität - irrelevant ist, man könnte auch am Ende einfach die Datei löschen. Würde die Implementierung funktionieren, dann wäre die Datei am Ende vorhanden, aber leer. Für PDFs_URLs.txt halte ich die sed-Zeile inhaltlich für falsch: Die Idee ist doch bestimmt, dass alle Download-URLs mit jeweils allen unterschiedlichen user-agent-strings aufgerufen werden (zumindest so lange, bis die Gegenseite das verhindert). Das ist auch aus deinem 1. Beitrag so zu erlesen und widerspricht der Implementierung, würde sie funktionieren. Irgendwie passt das schon wieder alles vorne und hinten nicht...

Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von desputin » 06.03.2022 12:42:48

Die Idee ist doch bestimmt, dass alle Download-URLs mit jeweils allen unterschiedlichen user-agent-strings aufgerufen werden
Korrekt. Dann müßte die Implementierung ganz anders laufen?
Man könnte sonst anstatt die woerter.txt zu verwenden, vielleicht auch zufällig generierte Wörter verwenden, oder?
Vielleicht sowas einbauen?

Code: Alles auswählen

tr -dc A-Za-z </dev/urandom | head -c 7 ; echo ''
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

tobo
Beiträge: 2072
Registriert: 10.12.2008 10:51:41

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von tobo » 06.03.2022 13:04:27

desputin hat geschrieben: ↑ zum Beitrag ↑
06.03.2022 12:42:48
Die Idee ist doch bestimmt, dass alle Download-URLs mit jeweils allen unterschiedlichen user-agent-strings aufgerufen werden
Korrekt. Dann müßte die Implementierung ganz anders laufen?
Einfach beide sed-Zeilen entfernen (PDFs_URLs.txt weil falsch und woerter.txt weil überflüssig). Sofern das Skript dann auch das tut, was es tun sollte. Im Moment ist das ja offensichtlich nicht der Fall...

Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von desputin » 06.03.2022 13:08:04

OK, ja, aber wie baue ich das dann ein?

Code: Alles auswählen

tr -dc A-Za-z </dev/urandom | head -c 7 ; echo ''
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

tobo
Beiträge: 2072
Registriert: 10.12.2008 10:51:41

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von tobo » 06.03.2022 13:35:16

desputin hat geschrieben: ↑ zum Beitrag ↑
06.03.2022 13:08:04
OK, ja, aber wie baue ich das dann ein?

Code: Alles auswählen

tr -dc A-Za-z </dev/urandom | head -c 7 ; echo ''
So z.B. mit einer bestimmbaren Anzahl an Durchläufen:

Code: Alles auswählen

#!/bin/sh

MAX=5    ##Anzahl Durchläufe

for i in `seq "$MAX"`; do
    uastr="`tr -dc A-Za-z </dev/urandom | head -c 7 ; echo ''`"
    wget -i PDFs_URLs.txt -w 22 -U "$uastr" --header="Accept: text/html" --server-response --load-cookies cookiesa.txt
done

Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von desputin » 06.03.2022 13:52:06

Hallo Tobo, vielen Dank!

Ja, das geht schon mal. Das seltsame ist. Daß wenn ich MAX auf 9 Stelle alles okay ist und ich ab dem 10. Versuch geblockt werde.

Wenn ich das Script danach aber neu starte, lädt er wieder 9 runter ohne Probleme. Verstehe das zwar nicht, aber so ist es.
D.h. ich will ja viel mehr als 9 PDFs runterladen, dann müßte ich quasi im Script MAX auf 9 stellen und das Script irgendwie so programmieren, daß es komplett abbricht nach 9 Versuchen und sofort wieder anfängt danach.

Die entscheidenden Fragen wären dann, wie es schaffen kann, daß innerhalb des Scripts das Script gestoppt und wieder neu anfangen wird nach 9 Downloads? Und wie kann ich dann dafür sorgen, daß er in der PDFs-URLs.txt nicht immer wieder von oben anfängt, sondern dort, wo er aufgehört hat.

Im Prinzip müßte das Script dann so aussehen:

Code: Alles auswählen

#!/bin/sh

MAX=9    ##Anzahl Durchläufe

for i in `seq "$MAX"`; do
    uastr="`tr -dc A-Za-z </dev/urandom | head -c 7 ; echo ''`"
    wget -i PDFs_URLs.txt -w 22 -U "$uastr" --header="Accept: text/html" --server-response --load-cookies cookiesa.txt
done
Dann Abbruch des Scriptes, dann (weil der SED-Befehl immer nur eine Zeile wegmachen kann, dann hier der tail-Befehl stattdessen):

Code: Alles auswählen

tail -n +10 "PDFs_URLs.txt" > "PDFs_URLs.tmp" && mv "PDFs_URLs.tmp" "PDFs_URLs.txt"
Dann Neustart des 1. Scripts und dann wieder der teil-Befehl usw.
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

tobo
Beiträge: 2072
Registriert: 10.12.2008 10:51:41

Re: Ein Wort in einem Befehl durch Wörter in Wortliste ersetzen?

Beitrag von tobo » 06.03.2022 14:40:19

desputin hat geschrieben: ↑ zum Beitrag ↑
06.03.2022 13:52:06
Und wie kann ich dann dafür sorgen, daß er in der PDFs-URLs.txt nicht immer wieder von oben anfängt, sondern dort, wo er aufgehört hat.
Diese Aussage widerspricht deinem 1. Beitrag und deiner expliziten Bestätigung. wget -i <Datei> lädt in jedem Schleifendurchgang immer jeweils alle URLs, die in <Datei> stehen. Wenn da 10 URLs drinstehen und du generierst MAX=5 Zufälle, dann hast du am Ende des Skripts 50 Downloads. Aber vielleicht kann sich da jetzt jemand anderes besser reindenken...

Und was sed angeht, da kann man schon auch mehrere Zeilen löschen (z.B. 1,9d).

Benutzeravatar
desputin
Beiträge: 1303
Registriert: 24.04.2015 17:16:34

LÖSUNG

Beitrag von desputin » 07.03.2022 00:36:35

Sodele, ich hab jetzt die Lösung:

Das Script:

Code: Alles auswählen

#!/bin/bash

tail -n +7 "PDFs_URLs.txt" > "PDFs_URLs.tmp" && mv "PDFs_URLs.tmp" "PDFs_URLs.txt"

MAX=1    ##Anzahl Durchläufe

for i in `seq "$MAX"`; do
    uastr="`tr -dc A-Za-z </dev/urandom | head -c 7 ; echo ''`"
    wget -i PDFs_URLs.txt -w 10 -U "$uastr" --header="Accept: text/html" --server-response --load-cookies cookiesa.txt
done
und das Script starte ich mit diesem Befehl:

Code: Alles auswählen

watch -n 3 xterm -e timeout 70 ./script.sh
Was er dann macht:
-Der Befehl führt das Script alle immer wieder aus (watch), wobei das Script sich nach jeweils 70 Sekunden wieder selber beendet (timeout)
-Das Script lädt alle 10 Sekunden eine PDF herunter mit unterschiedlichem Agent, bis es sich nach 70 Sekunden schließt von watch neu gestartet wird
-Beim Neustart des Scripts werden die ersten sieben Zeilen der jeweils in der letzten Runde heruntergeladenen PDFs gelöscht, damit es keine Doppelungen gibt.
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Antworten