![仅当字符串匹配时才输出到文件的 Oneliner(bash)?](https://linux22.com/image/146228/%E4%BB%85%E5%BD%93%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D%E6%97%B6%E6%89%8D%E8%BE%93%E5%87%BA%E5%88%B0%E6%96%87%E4%BB%B6%E7%9A%84%20Oneliner%EF%BC%88bash%EF%BC%89%EF%BC%9F.png)
我正在制作一个脚本,在其中卷曲 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
没有办法有条件地缓冲命令的输出。