Использование Grep -o или Sed / Awk для захвата фрагмента из середины строки

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

Пример URL:

http://www.bing.com/images/search?q=dagger+genesis+solo&view=detailv2&&&id=C65E811DFE01FB11258D2EB4F516F3DD8F09049C&selectedIndex=4&ccid=ffC0NVO8&simid=608046582336849763&thid=JN.XnLfF7qiZGwjJzTCR6f7ZQ&mode=overlay 

Я хочу вытащить сам поиск, «соло» кинжала.

Я могу

 grep -o '=*' 

но это оставляет знак = и все, что следует за поиском.

Я хочу захватить все между «search? Q =» и первым «&» в конце последнего слова, которому предшествует «+».

Я мог бы получить там очень длинный и запутанный способ, используя awk или разрезать, чтобы получить как можно большую часть моей строки, а затем использовать определенные разделители полей, чтобы поместить каждое слово в свой собственный столбец, а затем распечатать только те столбцы. Но даже этот метод не был бы последовательным, так как поиски могут быть любой длины и содержать практически любой символ.

Я думаю, что есть намного более простой способ. Идеи?

Моя конечная цель – разбить поисковые запросы и собрать их в уникальные записи.

4 Solutions collect form web for “Использование Grep -o или Sed / Awk для захвата фрагмента из середины строки”

Ты можешь сделать

 sed 's/^.*search?q=\([^&]*\)&.*/\1/' file 

То, что это делает, – это не жадное совпадение между search?q= и &

Какие результаты

 dagger+genesis+solo 

Если вы хотите заменить знаки + пробелами,

 sed 's/^.*search?q=\([^&]*\)&.*/\1/;s/+/ /g' file 

Какие результаты

 dagger genesis solo 

Если grep вашей системы поддерживает режим PCRE, вы можете использовать lookarounds (утверждения с нулевой длиной) для выбора символов между search?q= и &

 grep -Po '(?<=search\?q=).+?(?=&)' 

Использование не-жадного модификатора ? между ними заставляет матч останавливаться на первом & .

С sed :

 sed 's/\([^=&]*.\)\{2\}&.*/\1/' <<"" http://www.bing.com/images/search?q=dagger+genesis+solo&view=detailv2&&&id=C65E811DFE01FB11258D2EB4F516F3DD8F09049C&selectedIndex=4&ccid=ffC0NVO8&simid= 

Если для совпадения с обратным отсчетом указывается счетчик встречаемости, sed должен ссылаться только на указанное совпадение. Таким образом, в приведенном выше примере ссылка возвращается только

 dagger+genesis+solo 

Используя выражения grep look-behind и look-ahead:

 grep -oP "\=\K.*(?=\&view)" 

Вот,

 \K ==> zero-width look-behind assertion (?=\&view) ==> zero-width look-ahead assertion 

Следовательно, печатается только часть между \= и &view ie .* .

  • Как я могу сопоставить и заменить этот многострочный шаблон в сценарии bash?
  • Смутно о команде: sed '/ ^ # / d' ~ / .profile
  • поведение sed stdin
  • Более сжатые методы для обертывания файла, чем использование sed
  • отображать пользователей, которые вошли в систему с даты, используя последние
  • Извлечь URL из определенного шаблона (Google Alert)
  • Создание файлов из шаблонов, замещение в середине других слов
  • Возвращает количество совпадений с помощью find / replace с помощью sed
  • Вставка текста между двумя шаблонами
  • Как избежать несбалансированных скобок или слэш в sed?
  • Удалите строки из файла до шаблона, если шаблон не существует
  • Linux и Unix - лучшая ОС в мире.