Как мне подстроковать вывод по каналу из grep в Linux? - PullRequest
1 голос
/ 29 января 2012

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

curl http://www.drupalwebsite.org/?q=user | grep '<input type="hidden" name="form_build_id" id="form-[a-zA-Z0-9]*" value="form-[a-zA-Z0-9]*"  />'

Теперь я новичок в Linux и использую Cygwin с BASH.Как мне тогда передать вывод и использовать команду, чтобы получить значение атрибута id из вывода, сгенерированного grep?Я буду использовать эту подстроку позже, чтобы сделать еще один запрос curl для фактической отправки имени входа.

Я смотрел на использование expr, но я не совсем понимаю, как бы я сказал expr "о, эй, эти данные stdin яхочу, чтобы вы манипулировали таким образом ».Похоже, что единственный способ сделать это - сохранить вывод grep в переменной, а затем передать переменную в expr.

Ответы [ 2 ]

1 голос
/ 29 января 2012

Используйте sed, чтобы обрезать результаты, которые вы получаете от вашего grep, то есть.

edit : добавлена ​​переменная myID, используйте любое имя, которое вам нравится.

myID=$( 
  curl http://www.drupalwebsite.org/?q=user \
  | grep '<input type="hidden" name="form_build_id" id="form-[a-zA-Z0-9]*" value="form-[a-zA-Z0-9]*"  />' \
  | sed 's/^.* id="//;s/" value=.*$//'
)


#use ${myID} later in script
printf "myID=${myID}\n"

Первая часть удаляет «переднюю» часть строки, все до id=", в то время как вторая часть удаляет каждую " value= .....

Обратите внимание, что вы можете связать воедино несколько действий замещения в sed, разделив их символом ';'.

edit2 Кроме того, когда вы используетеsed, нет никакой причины использовать grep, попробуйте это:

myID=$( 
  curl http://www.drupalwebsite.org/?q=user \
  | sed -n '\@<input type="hidden" name="form_build_id" id="form-[a-zA-Z0-9]*" value="form-[a-zA-Z0-9]*"  />@{
       s\@^.* id="@@
       s\@" value=.*$@@p
   }'
)

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

Возможно, у вас естьэкранировать символы <и>, например, \ <> или, в худшем случае, [<] [>].

Теперь я использую '@' в качестве разделителя замены reg-ex, чтобы избежать экранирования любых символов '/' в строке srch-target.И я продолжаю использовать это во всем примере, просто чтобы быть последовательным.Для некоторых seds вы говорите им, что используете нестандартный разделитель, следовательно, ведущий \ @ в начале каждого блока кода sed.

-n означает «не печатать по умолчанию каждый»строка ввода ", и из-за этого мы должны добавить 'p' в конце, что означает печать текущего буфера.

Наконец, я не уверен насчет вашего регулярного выражения, особенно -[a-zA-Z0-9]*, это означает ноль или более предыдущего символа (или класса символов в данном случае).Обычно люди, которым нужен хотя бы один буквенно-цифровой код, используют -[a-zA-Z0-9][a-zA-Z0-9]*, да ИЛИ [[:alnum:]][[:alnum:]]*, но я недостаточно хорошо знаю ваши данные, чтобы сказать наверняка.

Надеюсь, это поможет.

1 голос
/ 29 января 2012

Вы можете снова использовать grep с опцией -o.Возможно два последовательных grep с, чтобы также отфильтровать окружающую id="..." часть.

   -o, --only-matching
          Print only the matched (non-empty) parts  of  a  matching  line,
          with each such part on a separate output line.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...