URL이 많은 텍스트 파일이 있습니다. 나는 그것을 사용하고 있다
curl -K "$urls" > $output
출력을 내 출력 파일에 뱉어냅니다. 이제 각 개별 URL의 출력에는 더 이상 정보가 필요하지 않은 "담보"라는 용어가 있습니다. 이제 나는 내가 사용할 수 있다는 것을 안다.
sed '/mortgage/q'
"담보"라는 용어 아래의 모든 정보를 제거하지만 이와 같은 스크립트에서 사용하는 경우
curl -K "$urls" | sed '/mortgage/q' > $output
$urls에 있는 첫 번째 URL의 출력에서 첫 번째 "mortgage" 인스턴스 아래의 전체 출력에서 모든 내용을 제거하지만, 이는 다른 URL의 모든 정보(이전에 "mortgage"라는 단어의 자체 인스턴스 포함)를 삭제합니다.") 각 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
즉, 컬 명령이 처음에 파일의 첫 번째 URL, sed
해당 URL 자료에 대해 명령을 실행하고, 에 추가한 $output
다음, 파일의 두 번째 URL로 루프백하고, sed 명령을 실행하고, 추가하는 $output
등... 이는 각 URL에 다음이 필요함을 의미합니다. 출력 파일이지만 각 URL의 "mortgage" 아래 내용은 포함되지 않습니다. 이것을 코드로 구현하는 방법을 모르겠습니다. 어떤 아이디어가 있나요?
답변1
이 작업은 두 줄로 수행되어야 합니다.
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 명령은 url 파일(예제에서는 /tmp/curl.conf)에서 URL을 추출합니다. 첫 번째 줄에서는 컬의 -O 옵션을 사용하여 각 페이지의 출력을 페이지 이름이 있는 파일에 저장합니다. 두 번째 줄에서는 각 파일을 다시 확인하고 관심 있는 텍스트만 표시합니다. 물론 파일에 "mortgage"라는 단어가 나오지 않으면 파일 전체가 출력될 것이다.
이렇게 하면 현재 디렉터리의 각 URL에 대한 임시 파일이 남게 됩니다.
편집하다:
다음은 남은 파일을 방지하고 결과를 stdout으로 출력하며 필요한 경우 거기에서 리디렉션할 수 있는 짧은 스크립트입니다.
#!/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"
답변2
이 일반적인 트릭은 컬 구성 파일에 다른 옵션(예: 사용자 에이전트, 리퍼러 등)이 포함되어 있어도 여전히 작동합니다.
첫 번째 단계로 구성 파일의 이름이 지정되었다고 가정합니다.컬 구성, 이는 awk '/^[Uu][Rr][Ll]/{print;print "output = dummy/"++k;next}1' curl_config > curl_config2
각 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/터미널 세션을 엽니다. rm결정적인파일이 있는 경우 위의 첫 번째 단계에서 생성된 컬_config2 파일을 사용하여 컬을 실행합니다.
[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
마지막으로 출력이 호출되는 것을 볼 수 있습니다.결정적인, 이것[1과 3]구분 기호는 echo "[$file]">> final
위에서 생성됩니다.
파일을 즉시 삭제하는 이유는 출력 파일이 크고 많은 URL을 계속 처리해야 하기 때문에 즉시 삭제하면 디스크 공간을 절약할 수 있다고 가정하기 때문입니다.