Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: фильтр вывода lspci -vv с помощью awk  (Прочитано 757 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 4ivortep

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
фильтр вывода lspci -vv с помощью awk
« : 06 Ноябрь 2011, 17:34:37 »
Добрый день.
Хочу отфильтровать вывод команды lspci -vv по интересующему меня переферии (usb,vga и т.д.)
делаю так
$lspci|awk -f myscript.awk

где myscript.awk моя головная боль.
Вот текст этого скрипта
Цитировать
  BEGIN {
   FS=":"
   a = "USB"
   b = "/^[0-9]+:[0-9][0-9,a-f].[0-9] * "a"/,/^[0-9]+:[0-9][0-9,a-f].[0-9] * [^"a"]/"
      }
b {if ($0 !~ /^[0-9]+:[0-9][0-9,a-f].[0-9] * [^a]/) print}

END {print "Конец работы"}

Вопрос мой такой : вообще можно ли такое провернуть с awk , точнее можно ли в переменные запихнуть регулярные выражения а потом использовать эти переменные вместо самих регулярных выражений или вставлять в другие регулярные выражения? Потому что я не пойму как заставить чтобы awk использовал переменную 'b' в качестве регулярного выражения при поиске нужной строки.



Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: фильтр вывода lspci -vv с помощью awk
« Ответ #1 : 07 Ноябрь 2011, 13:40:16 »
http://www.math.utah.edu/docs/info/gawk_5.html#SEC32
http://objectmix.com/awk/26966-using-variable-regex.html#post91418

т.е. Вам надо вместо b { ... } написать $0 ~ b { ... }
Но только, как сказано в доке (первая ссылка), лучше этого не делать - ударит по скорости работы и читабельности. Можно попробовать указать переменные в параметрах вызова самого awk с ключом -v
« Последнее редактирование: 07 Ноябрь 2011, 14:03:03 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн 4ivortep

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
Re: фильтр вывода lspci -vv с помощью awk
« Ответ #2 : 07 Ноябрь 2011, 19:12:36 »
Добрый вечер ( у меня уже вечер.)
меняю
b {if ($0 !~ /^[0-9]+:[0-9][0-9,a-f].[0-9] * [^a]/) print}
на
$0 ~ b {if ($0 !~ /^[0-9]+:[0-9][0-9,a-f].[0-9] * [^a]/) print}
скрипт  ничего не находит, то есть совпадений ноль.
упростил конструкцию до $0 ~ b { print } - совпадений нет.
Полный вариант скрипта таков
(Нажмите, чтобы показать/скрыть)
После выполнение команда дает такой результат
(Нажмите, чтобы показать/скрыть)

Есть еще идеи?

« Последнее редактирование: 07 Ноябрь 2011, 19:17:23 от 4ivortep »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: фильтр вывода lspci -vv с помощью awk
« Ответ #3 : 08 Ноябрь 2011, 12:52:50 »
Есть еще идеи?

Разумеется.

BEGIN {
b="/^[0-9]+:[0-9][0-9,a-f].[0-9] * USB/,/^[0-9]+:[0-9][0-9,a-f].[0-9] * [^USB]/"
      }
Регэксп неправильный. Ну то есть, совсем.

Во-первых, в динамических регэкспах слеши в начале и конце не нужны:
For example:
BEGIN { identifier_regexp = "[A-Za-z_][A-Za-z_0-9]+" }
$0 ~ identifier_regexp    { print }

Во-вторых, у Вас там два регэкспа, перечисленных через запятую.
awk такого не понимает. А даже если бы и понял, что с этим делать? (см. Взаимоисключающие параграфы)
« Последнее редактирование: 08 Ноябрь 2011, 13:00:23 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн 4ivortep

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
Re: фильтр вывода lspci -vv с помощью awk
« Ответ #4 : 08 Ноябрь 2011, 18:39:05 »
Есть еще идеи?

Разумеется.

BEGIN {
b="/^[0-9]+:[0-9][0-9,a-f].[0-9] * USB/,/^[0-9]+:[0-9][0-9,a-f].[0-9] * [^USB]/"
      }
Регэксп неправильный. Ну то есть, совсем.

Во-первых, в динамических регэкспах слеши в начале и конце не нужны:
For example:
BEGIN { identifier_regexp = "[A-Za-z_][A-Za-z_0-9]+" }
$0 ~ identifier_regexp    { print }

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

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

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: фильтр вывода lspci -vv с помощью awk
« Ответ #5 : 08 Ноябрь 2011, 19:04:29 »
Извиняюсь за свою невнимательность - спасибо что ткнули носом. Да если убрать слеши то регулярное выражение начинает работать,но его первая часть, до запятой. Просто два регулярных выражения через запятую дают нужный диапазон - выводить на печать между строкой которая совпала с первым выражением и останавливаться на строке которая совпала со вторым регулярным выражением,
Ага, век живи, век учись - не знал про range patterns.

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

Можно реализовать нужный функционал самостоятельно по образу и подобию awka. Похоже, динамических диапазонов он не умеет. Беглый поиск ничего не дал.

A range pattern starts out by matching begpat against every input record; when a record matches begpat, the range pattern becomes turned on. The range pattern matches this record. As long as it stays turned on, it automatically matches every input record read. It also matches endpat against every input record; when that succeeds, the range pattern is turned off again for the following record. Then it goes back to checking begpat against each record.
Завести переменную флаг, инициализировать значением false. Первым делом проверять флаг, если он true, выполнять нужные действия. В обработке begpat и endpat выполнять те же "нужные действия" и еще ставить флаг в true и false, соответственно.
« Последнее редактирование: 08 Ноябрь 2011, 19:06:37 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн 4ivortep

  • Автор темы
  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
Re: фильтр вывода lspci -vv с помощью awk
« Ответ #6 : 08 Ноябрь 2011, 20:13:47 »
Огромное спасибо, получилось вот что
(Нажмите, чтобы показать/скрыть)

Может с цветом уже лишнее.
Пойду думать что теперь с этим скриптом делать - где его можно было бы применить?

 

Страница сгенерирована за 0.073 секунд. Запросов: 26.