Grep в сценарии удара не будет работать правильно

Я знаю, что существует много подобных вопросов вокруг Интернета, но я не мог найти решение для своей определенной проблемы.

Я сделал этот сценарий для присвоения, где я хочу найти, который возврат комбинаций РАЗБЛОКИРОВАЛ в результате в 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 имеет эту проблему в сценарии и снаружи хорошо работает? Как я могу зафиксировать его?

1
задан 14 July 2016 в 12:16

2 ответа

Просто необходимо изменить регулярное выражение так, чтобы 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>)')" &

Примечание, однако, с которого сайта Вы пытаетесь загрузить, кажется, испытывает затруднения при контакте с несколькими последовательными запросами. Не работая параллельно, некоторые запросы возвращаются пустой (и работа, если выполнено вручную), и когда выполнение параллельно количества пустых результатов умножается. Вы могли бы хотеть говорить со своим учителем о фиксации этого.

0
ответ дан 7 December 2019 в 15:52

Я сожалею, возможно, я пропустил что-то.

Осматривают Вашу вихревую команду в оболочке. Отключите 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. Каналы удобны, после того как Вы знаете то, что Вы делаете и что Вы имеете. Я подозреваю здесь, что никакое условие не содержит.

1
ответ дан 7 December 2019 в 15:52

Другие вопросы по тегам:

Похожие вопросы: