Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование GREP 
V
    Опции темы
mihanik
Дата 8.2.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 13
Всего: 109



Дано:
Есть файл, в котором иногда встречаются идущие подряд строчки

Цитата

  <title>что-то</title>
  <link>где-то</link>


Надо:

При помощи grep вывести на экран все такие-вот пары строк.

Что я делаю

cat имя_файла | grep "^\s*<title>.*</title>"

или даже так

cat имя_файла | grep "^\s*<title>.*</title>.*[\n\r]*\s*"

При этом, как не сложно догадаться, на экран выводятся только строки типа 
Цитата

  <title>что-то</title>


При дальнейшем усложнении выражения ничего на экран уже не выдаётся...

Как заставить grep искать по шаблону во всём тексте, а не только в одной строке?
Прошу помощи.




--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
Фантом
Дата 8.2.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 10
Всего: 49



Такой вариант не годится?
Код

cat имя_файла | grep -A 1 "^\s*<title>.*</title>"

Или, если нужна именно проверка содержимого обеих строчек, то можно так:
Код

cat имя_файла | grep -A 1 "^\s*<title>.*</title>" | grep -B 1 "^\s*<link>.*</link>"

- возможно, не лучший способ, но наиболее простой в смысле "сведения задачи к предыдущей".  smile 
PM   Вверх
mihanik
Дата 8.2.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 13
Всего: 109



Фантом, думаю, что твой вариант не годиться, т.к. ты сначала ищешь все строки  вида <title>, а потом в том, что нашёл, ищешь строки вида <link>

Короче, ничего не найдётся.

Мне же нужно на экране получить сразу текст такого вот вида

Цитата

  <title>что-то</title>
  <link>где-то</link>
  <title>что-то</title>
  <link>где-то</link>
  <title>что-то</title>
  <link>где-то</link>
  <title>что-то</title>
  <link>где-то</link>
  <title>что-то</title>
  <link>где-то</link>
...



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 8.2.2011, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 13
Всего: 109



пока сделал так
Создал файл с критериями поиска следующего вида
Код

^\s*<title>.*</title>.*$
^\s*<link>.*</link>.*$


И подал команду 

cat имя_файла | grep -f файл_с_критериями_поиска

Но это не красивое решение.
Хочу красоты!!!



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
spin2
Дата 8.2.2011, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 15.12.2005
Где: Москва-Одесса

Репутация: 5
Всего: 31



Исходный файл:
Код

[1@1 ~]# cat nn.txt
rrr
rrr
<title>1</title>
<link>1</link>
eee
eee
<title>2</title>
www
www
<link>3</link>
qqq
qqq
<title>4</title>
<link>4</link>
aaa

Обработка:
Код

[1@1]# cat nn.txt |sed 'H;${x;s/<\/title>\n/<\/title>/g}'|grep "</title><link>"
<title>1</title><link>1</link>
<title>4</title><link>4</link>


Добавлено через 1 минуту и 5 секунд
Можно потом обратно переводы строк вставить, если нужно...


--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
bilbobagginz
Дата 8.2.2011, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 113
Всего: 317



все очень просто:
во первых, лучше делать так:
Код

grep "^\s*<title>.*</title>" test.file
grep "^\s*<title>.*</title>" test.file

(т.к. можно дать параметр -n номер строки, и т.д.)

я не понял что надо вывести.
Если надо вывести все строки, где присутствует корректный тэг title и link, то:
Код

grep -E "^\s*<title>.*</title>.*$|^\s*<link>.*</link>.*$" test.file

а если надо, чтобы вышли только те ссылки, которые после title, то так:
Код

grep -A1 "^\s*<title>.*</title>.*$" test.file | grep "^\s*<link>.*</link>.*$" -B1 | grep -v "\-\-"

последний элемент конвеера - опциональный, скидка остатков с пустых строк
если может быть '--' в title/link, то пользоваться им не стоит.

какие-то гнусные примеры из серии "решите за меня задачку".
"в реале" все это на ура решается на python/ruby/perl с помощью либы для парсинга XML.




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
mihanik
Дата 8.2.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 13
Всего: 109



spin2
гм...
А т.к. строка может начинаться с некоторого "пустого места", то команда будет такая

cat исходный_файл | sed 'H;${x;s/<\/title>\n/<\/title>/g}' | grep '</title>\s*<link>'

Добавлено через 12 минут и 50 секунд
Цитата(bilbobagginz @  8.2.2011,  21:42 Найти цитируемый пост)
я не понял что надо вывести.

Нужно вывести все упорядоченные пары строк.
Попробую описать так (с некоторыми неточностями, но, в общем, понятно)

<наполнение>:== <символ_алфавита> | <наполнение><символ_алфавита>

<конец_строки>:== \n

<titlestring>:==<<title><наполнение></title>>

<linkstring>:==<<link><наполнение></link>>

<упорядоченная_пара_строк>:==<titlestring><конец_строки><linkstring>


Это сообщение отредактировал(а) mihanik - 8.2.2011, 21:52


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 8.2.2011, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 13
Всего: 109



Цитата(bilbobagginz @  8.2.2011,  21:42 Найти цитируемый пост)
какие-то гнусные примеры из серии "решите за меня задачку".


Задачка была уже решена


Цитата(mihanik @  8.2.2011,  18:29 Найти цитируемый пост)
Создал файл с критериями поиска следующего вида
Выделить всёБез подсветки
1:
2:
    
^\s*<title>.*</title>.*$
^\s*<link>.*</link>.*$


И подал команду 

cat имя_файла | grep -f файл_с_критериями_поиска


Просто я красоты хочу.
Изящества. smile




--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
Фантом
Дата 8.2.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 10
Всего: 49



Цитата(mihanik @  8.2.2011,  18:11 Найти цитируемый пост)
Фантом, думаю, что твой вариант не годиться, т.к. ты сначала ищешь все строки  вида <title>, а потом в том, что нашёл, ищешь строки вида <link>

Короче, ничего не найдётся.

А попробовать запустить то, что я предлагал, ты не пытался?  smile 

Попытайся, результат тебя удивит. Ну а потом на досуге почитай man grep в части, касающейся описания действия ключей -A и -B.
PM   Вверх
mihanik
Дата 9.2.2011, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 13
Всего: 109



Цитата(Фантом @  8.2.2011,  22:56 Найти цитируемый пост)
А попробовать запустить то, что я предлагал, ты не пытался?  smile 

Гм...  smile 

Я сначала не понял твоей логики, а теперь понял...  smile 

Только вот одно но... Строчки выводятся парами, как того и требует левый палец на моей правой ноге, но между парами строк выводится "--"
А этого мой левый палец не хочет. smile

Цитата

  <title>Partimage</title>
  <link>http://mihanik.net/?p=1058</link>
--
  <title>Partclone</title>
  <link>http://mihanik.net/?p=1060</link>


убрать бы... Вот так...

Код

cat имя_файла | grep -A 1 "^\s*<title>.*</title>" | grep -B 1 "^\s*<link>.*</link>" | grep -v "\-\-"


Красиво, изящно, хорошо.

Всем спасибо.



Это сообщение отредактировал(а) mihanik - 9.2.2011, 08:54


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Oбщие вопросы"
nickless
Imple
nerezus

В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
Например вопросы о выборе ОС для определенных задач (но если Вы просто хотите узнать "Какой дистрибутив лучше", то для этого есть Клуб юнуксоидов).
Общие вопросы по shell-программированию тоже лучше задавать здесь.


  • Вопросы мобильной разработки тут
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.