我知道互联网上也有许多类似的问题,但是我找不到针对我特定问题的解决方案。
我为任务分配了此脚本,我想在其中查找哪些组合在HTML中返回UNLOCKED作为结果。
#!/bin/bash
for ((x4=0;x4<=4;x4++)); do
for ((x3=0;x3<=4;x3++)); do
for ((x2=0;x2<=4;x2++)); do
for ((x1=0;x1<=4;x1++)); do
echo $x1 $x2 $x3 $x4
eval curl http://www.artemiosv.info/21.php?p1=$x1;p2=$x2;p3=$x3;p4=$x4
| grep -oP '<BODY>*[\s\S]*</BODY>'
done
done
done
done
在将脚本的输出重定向到文件中之后,它返回的结果的第一行是:
0 0 0 0
<HTML><BODY>LOCKED</BODY></HTML>1 0 0 0
<HTML><BODY>LOCKED</BODY></HTML>2 0 0 0
<HTML><BODY>LOCKED</BODY></HTML>3 0 0 0
从HTML代码(这是curl命令的实际结果),在那些行被锁定的情况下,我只想要主要文本。但是我使用的正则表达式似乎无法正常工作,而在脚本外部测试相同模式可以正常工作。HTML的预期结果应该是“锁定”,“解锁”,我认为您发现了这个秘密。
为什么grep在脚本内部和外部都可以正常运行此问题?我该如何解决?
您只需要更改正则表达式即可排除HTML标记。由于您使用的是Perl兼容的正则表达式,因此可以使用\K
“表示丢弃到目前为止所有匹配的内容|”。放弃了<BODY>
,积极向前放弃了</BODY>
。您还可以使用大括号扩展代替繁琐的for((var=0;var<=lim;var++))
语法:
for x4 in {0..4}; do
for x3 in {0..4}; do
for x2 in {0..4}; do
for x1 in {0..4}; do
curl "http://www.artemiosv.info/21.php?p1=$x1;p2=$x2;p3=$x3;p4=$x4" 2>/dev/null |
grep -oP '<BODY>\K[\s\S]*(?=</BODY>)'
done
done
done
done
或者,如果您既需要HTML内容,又需要4个变量的值,请使用以下命令:
for x4 in {0..4}; do
for x3 in {0..4}; do
for x2 in {0..4}; do
for x1 in {0..4}; do
printf '%s : %s\n' "$x1 $x2 $x3 $x4" \
"$(curl "http://www.artemiosv.info/21.php?p1=$x1;p2=$x2;p3=$x3;p4=$x4" 2>/dev/null |
grep -oP '<BODY>\K[\s\S]*(?=</BODY>)')"
done
done
done
完毕
请注意,我也删除了,eval
因为这没有做任何有用的事情。您只需要重定向stderr。
最后,您还可以将curl
命令发送到后台,以便可以并行运行许多命令。这些命令不是很繁琐,因此您的计算机应该能够处理这些命令,它将大大加快脚本的速度。只需&
在行末添加printf ...
:
printf '%s : %s\n' "$x1 $x2 $x3 $x4" \
"$(curl "http://www.artemiosv.info/21.php?p1=$x1;p2=$x2;p3=$x3;p4=$x4" 2>/dev/null |
grep -oP '<BODY>\K[\s\S]*(?=</BODY>)')" &
但是请注意,您尝试从中下载的站点似乎无法处理多个连续的请求。即使不并行运行,某些请求也返回空(如果手动运行,则工作),并且并行运行时,空结果的数量也会成倍增加。您可能想与您的老师谈谈解决此问题的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句