Tôi có một danh sách dài các URL. Chứa trong mỗi trang web này, có những liên kết tôi cần trích xuất. Hành động Automator Nhận URL liên kết từ các trang web là một hành động rất hữu ích cho nhiệm vụ này. Thật không may, bản thân Automator không xử lý khối lượng công việc nặng rất tốt và rất thường xuyên bị treo hoặc treo vô thời hạn. Làm thế nào tôi có thể thực hiện điều này bằng cách sử dụng Bash thông qua ứng dụng Mac OS X Terminal?
Chỉnh sửa - đây là kịch bản hiện tại vì nó đứng ngay bây giờ.
#!/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
Tôi đã thêm read -p
vào phần đầu của kịch bản. Có giới hạn về số lượng biến có thể được sử dụng như thế này không? Tôi đã sử dụng thành công tới 9 trong thử nghiệm. Và có cách nào thực tế hơn để viết này? Tôi đã thử read -p "" {v1..v9}
mà không làm việc. Tôi đã thêm một vài for
vòng lặp ở cuối để cho biết có bao nhiêu dữ liệu được xử lý.
Các vấn đề hiện tại
đôi khi tôi gặp lỗi
sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem.
tuy nhiên khi thêm
LS_ALL=C
vào tập lệnh thì có vẻ không đúng.