たくさんのURLが入ったテキストファイルがあります。使っています
curl -K "$urls" > $output
出力を出力ファイルに吐き出します。ここで、それぞれの個別のURLの出力に、「住宅ローン」という用語があります。その下には、これ以上の情報は必要ありません。今、私は使用できることを知っています
sed '/mortgage/q'
「住宅ローン」という用語の下にあるすべての情報を削除しますが、スクリプト内でそのように使用すると
curl -K "$urls" | sed '/mortgage/q' > $output
$ urlsの最初のURLの出力から「住宅ローン」の最初のインスタンスの下の出力全体からすべてを削除しますが、これにより、他のURLのすべての情報が消去されます(「住宅ローン」という単語の独自のインスタンスの前のものを含む) ")各URLではなく、出力全体で機能しているためです。
sed '/mortgage/q'
を指定して、URLファイル内の各URLの出力に個別に作用し、出力にグローバルに影響を与えないようにするにはどうすればよいですか?
私のURLファイルは非常に単純で、次の形式です(これは単なる例です):
URL = http://www.bbc.co.uk/sport/rugby-union/34914911
URL = http://stackoverflow.com/questions/9084453/simple-script-to-check-if-a-webpage-has-been-updated
等々.....
私はこれを達成するための架空の方法を考えましたが、コードはわかりません-curl -K "$urls" | sed '/mortgage/q' > $output
ファイル内の後続の各URLの後にコマンドがループバックするように、$url
コマンドを適応させる方法はありますか。 curlコマンドが最初にファイルの最初のURLを取得し、そのURLマテリアルに対してsed
コマンドを実行し、$output
に追加してから、ファイルの2番目のURLにループバックし、 sedコマンド、$output
への追加など...これは、各URLから必要な資料が出力ファイルに含まれているが、各URLの「mortgage」の下のものは含まれていないことを意味します。コードでこれを実現する方法がわかりません。何か案は?
これは2行でそれを行う必要があります:
sed -n 's/\s*URL\s*=\s*\(.*\)/\1/p' /tmp/curl.conf|xargs -I {} curl -O "{}"
sed -n 's/\s*URL\s*=\s*\(.*\)/\1/p' /tmp/curl.conf|xargs -I {} basename "{}"|xargs -I {} sed '/mortgage/q' "{}"
各行の最初のsedコマンドは、urlsファイル(例では/tmp/curl.conf)からURLを抽出します。最初の行では、curlの-Oオプションを使用して、各ページからの出力をページの名前を持つファイルに保存します。 2行目では、これらの各ファイルを再検討し、関心のあるテキストのみを表示します。もちろん、「住宅ローン」という単語がファイルに含まれていない場合は、ファイル全体が出力されます。
これにより、現在のディレクトリ内の各URLの一時ファイルが残ります。
編集:
これは、残りのファイルを回避する短いスクリプトです。結果を標準出力に出力します。必要に応じて、そこからリダイレクトできます。
#!/bin/bash
TMPF=$(mktemp)
# sed command extracts URLs line by line
sed -n 's/\s*URL\s*=\s*\(.*\)/\1/p' /tmp/curl.conf >$TMPF
while read URL; do
# retrieve each web page and delete any text after 'mortgage' (substitute whatever test you like)
curl "$URL" 2>/dev/null | sed '/mortgage/q'
done <"$TMPF"
rm "$TMPF"
この一般的なトリックは、curl構成ファイルにuser-agent、refererなどのその他のオプションが含まれている場合でも機能します。
最初のステップでは、curl_configという名前の構成ファイルを想定し、awk '/^[Uu][Rr][Ll]/{print;print "output = dummy/"++k;next}1' curl_config > curl_config2
を使用して、下に異なる出力ファイル名を段階的に追加する新しいcurl構成ファイルを作成します。各URL/URL:
例:
[xiaobai@xiaobai curl]$ cat curl_config
URL = "www.google.com"
user-agent = "holeagent/5.0"
url = "m12345.google.com"
user-agent = "holeagent/5.0"
URL = "googlevideo.com"
user-agent = "holeagent/5.0"
[xiaobai@xiaobai curl]$ awk '/^[Uu][Rr][Ll]/{print;print "output = dummy/"++k;next}1' curl_config > curl_config2
[xiaobai@xiaobai curl]$ cat curl_config2
URL = "www.google.com"
output = dummy/1
user-agent = "holeagent/5.0"
url = "m12345.google.com"
output = dummy/2
user-agent = "holeagent/5.0"
URL = "googlevideo.com"
output = dummy/3
user-agent = "holeagent/5.0"
[xiaobai@xiaobai curl]$
次に、mkdir dummy
を使用して、この一時ファイルを保持するディレクトリを作成します。 inotifywait
セッションを作成します(sed '/ google/q'をsed '/ mortgage/q'に置き換えます):
[xiaobai@xiaobai curl]$ rm -r dummy; mkdir dummy;
[xiaobai@xiaobai curl]$ rm final
[xiaobai@xiaobai curl]$ inotifywait -m dummy -e close_write | while read path action file; do echo "[$file]">> final ; sed '/google/q' "$path$file" >> final; echo "$path$file"; rm "$path$file"; done;
Setting up watches.
Watches established.
別のbash /ターミナルセッションを開き、rmfinalファイルが存在する場合は、上記の最初のステップで作成したcurl_config2ファイルを使用してcurlを実行します。
[xiaobai@xiaobai curl]$ curl -vLK curl_config2
...processing
ここでinotifywaitセッションを見てください。最新のクローズ書き込みファイルが出力され、sedされ、完了したらすぐに削除されます。
[xiaobai@xiaobai curl]$ inotifywait -m dummy -e close_write | while read path action file; do echo "[$file]">> final ; sed '/google/q' "$path$file" >> final; echo "$path$file"; rm "$path$file"; done;
Setting up watches.
Watches established.
dummy/1
dummy/3
最後に、final、[1および3]という名前の出力を確認できます。 )セパレータは上記のecho "[$file]">> final
から生成されます。
ファイルをすぐに削除する理由は、出力ファイルが大きく、多くのURLを続行する必要があると想定しているため、ディスク領域を節約してすぐに削除できるためです。