我正在尝试传递curl
请求和来自回复正文,我正试图寻找一个关键词" coin"。如果" coin
"单词匹配,我需要得到" 0"或" 1"输入网址为prefix
(逗号delineated
)。
$for i in $(cat small);do curl -i -H "Accept: application/json" $i | grep "coin";echo $? | sed "s/^\(.\)/$i,\1/";done
#cat small
http://cuevana0.tv/
https://www.1111data.com/
我添加输入作为结果的前缀" sed" s /^(.)/$ i,\ 1 /"。
但我的错误是
$ for i in $(cat small);do curl -i -H "Accept: application/json" $i | grep "coin";echo $? | sed "s/^\(.\)/$i,\1/";done
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 633k 0 633k 0 0 909k 0 --:--:-- --:--:-- --:--:-- 908k
<script src="https://coin-hive.com/lib/coinhive.min.js"></script>
sed: -e expression #1, char 16: unknown option to `s'
有关如何解决此问题的任何建议?虽然以上不是一个好习惯,但它会及时帮助我。
预期结果:
http://cuevana0.tv/,0
答案 0 :(得分:3)
我认为在bash
中使用cat
使用工具(grep
,返回代码)正确使用<{p}}的正确方法是正确的编码方式
#!/usr/local/env bash
while IFS= read -r url; do
if curl -i -H "Accept: application/json" "$url" 2>&1 | grep -q "coin"; then
printf "%s,0\n" "$url"
else
printf "%s,1\n" "$url"
fi
done < urlFile
以上代码使用正确的方法
while
循环和read
命令循环浏览文件(避免在有空格时分隔行)grep
到控制台if
子句中使用-q
的返回码
stdout
的{{1}}和stderr
传递给curl
以查找关键字。正如伟大的glenn-jackman指出的那样,你可以将整个if-else子句替换为
grep
意味着在管道之后立即打印curl -i -H "Accept: application/json" "$url" 2>&1 | grep -q "coin"; printf "%s,%d\n" "$url" $?
的错误代码。
答案 1 :(得分:2)
当前的问题是你正在使用&#34; /&#34;字符作为sed
表达式中的分隔符,但是您替换的字符串也包含&#34; /&#34;,因此sed
错误表示分隔符并且非常混淆。例如,在网址&#34; http://cuevana0.tv/&#34;上,您正在运行命令:
sed "s/^\(.\)/http://cuevana0.tv/,\1/"
...由于额外的&#34; /&#34;这是无效的sed
语法字符。您可以切换为使用其他分隔符,例如... | sed "s@^\(.\)@$i,\1@"; ...
(如果您确定&#34; @&#34;将永远不会出现在您的某个网址中)。
但是,有一个更好的方法来做到这一点。而不是echo
状态然后使用编辑添加网址,只需使用echo "$i,$?"
。
这里的另一件事是一个坏主意:for i in $(cat small)
会受到许多潜在问题的影响,具体取决于文件可能包含的空格和/或通配符。通常,while read -r i; do ... done <small
更容易预测。除非循环内的任何内容从stdin读取(或可能从stdin读取),否则应使用while read -r i <&3; do ... done 3<small
代替。