2016-09-20 42 views
1

我試圖寫一個腳本,將按照以下順序做了一些事情,在網站和grep:從包含在「URL_LIST內的URL列表使用bash捲曲的關鍵字

  1. 捲曲網站.txt「(新線劃定的)文件。
  2. 對於列表中的每個網站,我希望grep該網站尋找包含在「keywords.txt」(新線描述)文件中的關鍵字。
  3. 我想通過打印到以下格式(或類似的東西)的終端來完成:

    $ URL(包含匹配):$關鍵字(即取得這場比賽的)

它需要能夠運行在Ubuntu(GNU grep等)

它不需要cURL和grep;只要功能在那裏。

到目前爲止我有:

#!/bin/bash 
keywords=$(cat ./keywords.txt) 
urllist=$(cat ./url_list.txt) 
for url in $urllist; do 
     content="$(curl -L -s "$url" | grep -iF "$keywords" /dev/null)" 
     echo "$content" 
done 

但由於某些原因,不管什麼我嘗試調整或改變,它使未能或多或少。

我該如何去完成這項任務?

感謝

回答

3

這是我會怎麼做:

#!/bin/bash 
keywords="$(<./keywords.txt)" 
while IFS= read -r url; do 
    curl -L -s "$url" | grep -ioF "$keywords" | 
     while IFS= read -r keyword; do 
      echo "$url: $keyword" 
     done 
done < ./url_list.txt 

我是怎麼改變:

  • 我以前$(<./keywords.txt)讀取keywords.txt。這不依賴於外部程序(原始腳本中的cat)。
  • 我將循環遍歷url列表的for循環更改爲while循環。這保證我們使用Θ(1)內存(即我們不需要在內存中加載整個url列表)。
  • 我從grep中刪除/ dev/null。僅僅從/dev/null單獨是沒有意義的,因爲它在那裏什麼也找不到。相反,我調用grep而沒有參數,以便它過濾它的stdin(在這種情況下恰好是curl的輸出)。
  • 我爲grep添加了-o標誌,以便它僅輸出匹配的關鍵字。
  • 我刪除了您正在捕獲curl輸出的子shell。相反,我直接運行該命令並將其輸出提供給while循環。這是必要的,因爲我們可能會獲得超過每個網址的關鍵字匹配。
+1

您可以使用'grep -ioF -f。/ keywords.txt' – anishsane

+0

像魅力一樣工作!謝謝! 一個問題, 如果同一個URL上的同一個關鍵字有多個匹配項,該怎麼辦? 有沒有一種獨特的輸出方式? – Probie

+0

@Probie然後你可以做一些像'curl -L -s「$ url」| grep -ioF「$關鍵字」|排序| uniq |'。 – redneb