문자열이 일치하는 경우에만 파일로 출력하는 Oneliner(bash)?

문자열이 일치하는 경우에만 파일로 출력하는 Oneliner(bash)?

URL을 컬링하고 다음과 같은 파일로 출력하는 스크립트를 만들고 있습니다.

curl http://example.com/$1 > $1

포함되지 않은 항목을 무시하도록 하는 방법이 있습니까 <head>? 물론 다음과 같이 할 수 있습니다.

web="$(curl http://example.com/$1)"
if $(echo "$web" | grep -q "<head>"); then
printf "$web" > "$1"
fi

하지만 이 스크립트는 여러 번 실행될 수 있으므로 시간을 절약하고 싶습니다.

답변1

파일에 저장하고 태그가 포함되어 있지 않으면 태그를 제거하세요.

curl "http://example.com/$1" >"$1"
! grep -qF '<head>' "$1" && rm "$1"

아니면 좀 더 복잡하게 만들고 싶다면,

if curl "http://example.com/$1" | tee "$1" | ! grep -qF '<head>'
then
    rm "$1"
fi

아니면모두먼저 얻고,그 다음에생성된 파일을 찾아보고 삭제합니다.

mkdir outdir  # assuming this is not pre-existing

# iterates over all positional parameters
for path do
    curl "http://example.com/$path" >outdir/"$path"
done

find outdir -type f ! -exec grep -qF '<head>' {} \; -delete

그러나 이는 알려진 모든 파일을 고정 경로 아래로 가져오려는 경우에만 작동합니다.

답변2

다음을 수행할 수 있습니다.

grep -hIz '<head>' < <(curl -s "http://example.com/$1") > "$1" || rm "$1"

이렇게 하면 모든 출력이 억제됩니다.~하지 않는 한<head>어떤 경우에 인쇄할지 포함됩니다 .모두산출. 일치하는 항목이 없으면 어쨌든 빈 파일이 생성되므로 삭제해야 합니다.

답변3

재미로:

curl "http://example.com/$1" | tee temp | grep -q derp && cat temp; rm temp

컬 출력을 파일에 저장하고 출력을 grep으로 파이프한 다음, grep은 derp출력을 검색하고, 발견되면 컬 명령의 내용을 stdout으로 출력합니다. derp찾을 수 없으면 스크립트 출력이 없습니다. 그런 다음 임시 파일이 삭제됩니다.

bash명령의 출력을 조건부로 버퍼링할 수 있는 방법이 없기 때문에 파일에 "버퍼링"하지 않고 이 작업을 수행할 수 있는지 확실하지 않습니다 .

관련 정보