2016-09-20 2 views
1

나는 다음과 같은 순서로 몇 가지 작업을 수행하는 스크립트 작성하려고 해요위한 웹 사이트 및 그렙 컬하는 배쉬를 사용 : "URL_LIST에 포함 된 URL 목록에서키워드

  1. 컬 웹 사이트 .txt "(줄 바꿈 문자) 파일.
  2. 목록의 각 웹 사이트에 대해 "keywords.txt"(줄 바꿈 문자) 파일에 포함 된 키워드를 찾는 grep을 원합니다.

(경기를 만들어 그) $ 키워드 :

$ URL (즉 포함 일치) :

  • 나는 다음과 같은 형식 (또는 비슷한)의 단자에 인쇄하여 완료 할 우분투에서 실행할 수 있어야합니다 (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)에 의존하지 않습니다.
    • for 루프를 변경하여 while 루프로 변경했습니다. 우리가 Θ(1) 메모리를 사용하는 경우 (즉, 전체 URL 목록을 메모리에로드 할 필요가없는 경우).
    • grep에서/dev/null을 제거합니다. /dev/null에서 grep ing는 아무 것도 찾을 수 없으므로 의미가 없습니다. 대신 grep을 인수없이 호출하여 stdin (이 경우에는 curl의 출력이됩니다)을 필터링합니다.
    • 일치 키워드 만 출력하도록 grep-o 플래그를 추가했습니다.
    • curl 출력을 캡처하는 하위 셸을 제거했습니다. 대신 명령을 직접 실행하고 출력을 while 루프에 공급합니다. URL 당 키워드 일치 이상을 얻을 수 있기 때문에 필요합니다.
    +1

    아마도 'grep -ioF -f./keywords.txt'를 사용할 수 있습니다. – anishsane

    +0

    매력처럼 작동합니다! 고맙습니다! 하나의 질문, 동일한 URL에 동일한 키워드에 대해 일치하는 키워드가 여러 개인 경우 어떻게 될까요? 고유 한 출력 방법이 있습니까? – Probie

    +0

    @Probie 그런 다음 'curl -L -s "$ url"| grep -ioF "$ keywords"| 정렬 | uniq |'. – redneb