私は現在Webクローラーボットを作成しています。重複したエントリを削除し、行をアルファベット順に並べ替える必要があるURLのリストを生成します。私のコードは次のとおりです
#! /bin/bash
URL="google.com"
while [ 1 ]; do
wget --output-document=dl.html $URL
links=($(grep -Po '(?<=href=")[^"]*' dl.html))
printf "%s\n" ${links[@]} >> results.db
sort results.db | uniq -u
URL=$(shuf -n 1 results.db)
echo $URL
done
特にこの行は:
sort results.db | uniq -u
ベストアンサー1
POSIX説明するuniq -u
:
入力に重複した行を書き込むのを抑制します。
これは、冗長行(元の行を含む)がフィルタリングされることを意味します。おそらく(完了POSIX返品):
sort -u results.db
の場合、sort -u
POSIXは次のように言います。
固有:除外を除く一つ同じキーを持つ各行グループに。 -cオプションと一緒に使用すると、入力ファイルがソートされていることを確認するだけでなく、重複キーを含む行がないことを確認します。
どちらの場合も、次の行は
URL=$(shuf -n 1 results.db)
sort/uniq の目的は次のとおりです。修正する results.db
(そうではありません)。これを行うには、スクリプトをさらに変更する必要があります。
sort -u results.db >results.db2 && mv results.db2 results.db
または(@drewbennが提案したように)前の行と組み合わせます。しかしそれ以来追加ファイルに(その答えに示されているコマンドを組み合わせても最新のprintfとファイルの内容との重複は削除されません)、別のコマンドsort / mvが元のスクリプトに近いように見えます。
nullでないことを確認するには$URL
(実際には別の質問です)、testを使用してください[
。
[ -n "$URL" ] && wget --output-document=dl.html $URL
単にループを終了する方が簡単ですが、
[ -z "$URL" ] && break