Mam długą listę adresów URL. Na każdej z tych stron znajdują się linki, które muszę wyodrębnić. Akcja Automatora Pobierz adresy URL linków ze stron internetowych jest bardzo przydatną akcją dla tego zadania. Niestety sam Automator nie radzi sobie dobrze z dużymi obciążeniami i bardzo często ulega awarii lub zawiesza się w nieskończoność. Jak mogę to zrobić za pomocą Bash za pośrednictwem aplikacji terminalowej Mac OS X?
Edytuj - jest to bieżący skrypt w obecnej postaci.
#!/bin/bash
echo "Enter up to 3 words"
read -p "" v1 v2 v3
web="$HOME/web.txt"
tmp="$HOME/tmp.txt"
err="$HOME/err.txt"
fin="$HOME/fin.txt"
arc="$HOME/arc.txt"
n="$(awk 'END {print NR}' "$web")"
echo "Processing $n URLs..."
grep 'http' "$web" | \
while read -r url; do
lynx -nonumbers -hiddenlinks=merge -dump -listonly "$url" 2>>"$err" | awk '!a[$0]++' >> "$tmp"
sleep 1
n=$((n-1))
[[ $n -gt 0 ]] && echo "$n URLs left to process..." || echo "Processing Completed!"
done
grep -e "$v1" -e "$v2" -e "$v3" "$tmp" | sort -u | cat > "$fin"
cat "$fin" >> "$arc"
for r in "Results This Session"; do echo "$(cat "$fin" | wc -l)" "$r"; done
for a in "URL's Archived"; do echo "$(cat "$arc" | wc -l)" "$a"; done
Dodałem read -p
na początku skryptu. Czy istnieją ograniczenia dotyczące liczby zmiennych, których można użyć w ten sposób? Z powodzeniem wykorzystałem do 9 w testowaniu. Czy istnieje bardziej praktyczny sposób na napisanie tego? Próbowałem, read -p "" {v1..v9}
co nie zadziałało. Na końcu dodałem kilka for
pętli, aby wskazać, ile danych zostało przetworzonych.
Bieżące problemy
czasami pojawia się błąd
sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem.
jednak po dodaniu
LS_ALL=C
do skryptu nie wydaje się to poprawne.