Intereting Posts
Переименование нескольких файлов в unix Запрет доступа к файлу Daemon не должен Почему 2 периферийных устройства bluetooth не мешают? (мышь и клавиатура) Включить шифрование 3DES для openssl 1.0.1t на Debian 7 Измерение свободного прохода / proc / meminfo с помощью ramdisk (initrd) Есть ли способ написать плагин tmux, чтобы выбрать одну строку? Перемещение выделенной клип-карты в основную часть при поступлении нового контента Как снова включить Nouveau После установки графического драйвера NVIDIA неправильно на Kali Linux Подключение к Wi-Fi на Arch Linux Этот диск погиб? PCI Passthrough KVM с vfio-pci, предоставляющим EINVAL на PCI Probe / dev / tty * последовательные устройства находятся в группе «root» на секунду, прежде чем они переключаются на группу «dialout». Как заставить их начать в «дозвоне»? Кали не признает ALFA AWUS051NH Почему ядро ​​использует режим, а не разделение привилегий? Opticon OPN-3002i нет ttyUSB0

Использование 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 или разрезать, чтобы получить как можно большую часть моей строки, а затем использовать определенные разделители полей, чтобы поместить каждое слово в свой собственный столбец, а затем распечатать только те столбцы. Но даже этот метод не был бы последовательным, так как поиски могут быть любой длины и содержать практически любой символ.

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

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

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

 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 .* .