Я знаю, что существует много подобных вопросов вокруг Интернета, но я не мог найти решение для своей определенной проблемы.
Я сделал этот сценарий для присвоения, где я хочу найти, который возврат комбинаций РАЗБЛОКИРОВАЛ в результате в HTML.
#!/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-кода, который является фактическим результатом вихревой команды, я хочу только основной текст, в случае тех ЗАБЛОКИРОВАННЫХ строк. Но regex, который я использовал, кажется, не работает, в то время как тестирование того же шаблона за пределами сценария хорошо работает. Ожидаемые результаты 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>)')" &
Примечание, однако, с которого сайта Вы пытаетесь загрузить, кажется, испытывает затруднения при контакте с несколькими последовательными запросами. Не работая параллельно, некоторые запросы возвращаются пустой (и работа, если выполнено вручную), и когда выполнение параллельно количества пустых результатов умножается. Вы могли бы хотеть говорить со своим учителем о фиксации этого.
Я сожалею, возможно, я пропустил что-то.
Осматривают Вашу вихревую команду в оболочке. Отключите grep и выполните его. Когда я делаю это, я вижу целый возврат. Я возвращаюсь, сотни времен
<HTML><BODY>LOCKED</BODY></HTML>
, который я думаю, указывает, что веб-сайт блокирует Ваше усилие очистить его. Heck, просто просмотрите это:
http://www.artemiosv.info/21.php?p1=1;p2=2;p3=3;p4=4
Это возвращает страницу, которая просто говорит "ЗАБЛОКИРОВАННЫЙ"
Относительно grep вопроса, grep выберет строки, которые имеют символьный шаблон. Это не подвыбирает строки внутри там, именно это инструмент как sed для. Я думаю, что grep дает Вам точно, что Вы просите. Вы говорите, что это работало в тестовом сценарии, но я не могу вообразить как.
, Почему бы не следовать простым маршрутом выполнения веб-царапанья и сохранить файлы в Вашем ПК, затем сделайте grep/sed/awk волшебство на них. Это - единственный способ быть уверенным в том, что Вы на самом деле получаете при получении материала. И это - намного более вероятный способ, которым Вы получите то, в чем Вы нуждаетесь от grep или sed. Каналы удобны, после того как Вы знаете то, что Вы делаете и что Вы имеете. Я подозреваю здесь, что никакое условие не содержит.