web-dev-qa-db-ja.com

URL txtファイルをカールしますが、各URLを単一のファイルとは別にgrepします

たくさんの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
neilH

これは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"
3
gogoud

この一般的なトリックは、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から生成されます。

enter image description here

ファイルをすぐに削除する理由は、出力ファイルが大きく、多くのURLを続行する必要があると想定しているため、ディスク領域を節約してすぐに削除できるためです。

0
林果皞