仅当字符串匹配时才输出到文件的 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

将curl 输出保存到文件并将输出传送到grep,然后grepderp在输出中进行搜索,如果找到,则将curl 命令的内容输出到stdout,如果derp未找到,则没有脚本输出。然后临时文件将被删除。

不确定是否可以在不“缓冲”到文件的情况下执行此操作,因为bash没有办法有条件地缓冲命令的输出。

相关内容