我正在尝试创建一个更有效的“检查URL是否存在”功能,而我几乎完成了唯一的障碍就是正则表达式。
所以我正在寻找一个匹配输出的任何第一个字符然后打印并退出的正则表达式 例如,波纹管代码获取youtube页面的源代码,一旦输出到达标题标签,它就会匹配它们并且它会杀死wget命令
从这里借来的想法
https://unix.stackexchange.com/questions/103252/how-do-i-get-a-websites-title-using-command-line
性能/效率
在这里,出于懒惰,我们有perl读取内存中的全部内容 在开始寻找标签之前。鉴于标题是 在该部分的前几个字节中找到 文件,这不是最佳的。如果GNU awk可用,则更好的方法 在你的系统上可能是:
wget -qO- 'http://www.youtube.com/watch?v=Dd7dQh8u4Hc' | \ gawk -v IGNORECASE=1 -v RS='</title' 'RT{gsub(/.*<title[^>]*>/,"");print;exit}'
那样,awk停止阅读 在第一次之后
我的逻辑是:如果URL存在,它将输出源,我不想浪费时间,因此在源代码输出的第一个字符上下载整个源代码,打印并退出。
然后我将存储wget和gawk的输出
first_character_of_source_code=$(wget|awk magic)
if [[ $first_character_of_source_code != '' ]]; then
echo "URL exists!"
else
echo "URL doesn't exist!"
fi
另外,对于我的“检查网址是否存在”功能,我试过这个How do I determine if a web page exists with shell scripting? 答案中建议的curl解决方案大多没问题,但像Quora这样的网站返回403 Forbidden,是的我添加了用户代理但是wget加gawk解决方案返回源代码,这更好地确定了URL是否存在。
答案 0 :(得分:2)
如果你没有如此致力于使用awk,你可以使用grep
快速轻松地完成它:
if wget -qO - https://stackoverflow.com/ | grep -q ""
then
echo "wget returned at least one character."
fi
答案 1 :(得分:1)
我找到了解决方案,感谢@karakfa的建议
匹配输出的第一个字符,打印并退出
echo "Yes, a down vote, just what I needed" | awk '{print $1;exit}' FS=""
# It will print
Y
我的脚本的完整源代码
check_URL.sh
(完美地工作)
# Variables
URL="$*"
user_agent="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
# Main program
first_character_of_source_code=$(wget -e robots=off --user-agent="$user_agent" -qO- "$URL" | \
awk '{print $1;exit}' FS="")
if [[ $first_character_of_source_code != '' ]]; then
echo "URL exists!"
exit 0
else
echo "URL doesn't exist!"
exit 1
fi