LinuxForum.Fans
Тема

Сложный поиск текста в файлах

Автор: valet 9 сообщений 1935 просмотров
#194528

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

Объяснить такое мне очень сложно, поэтому покажу на примере.

Нужно найти все файлы, в которых есть вхождение "http://", после которого идут любые символы кроме заданных. Например заданные это "site.ru". То есть если в файле присутствует например вхождение "http://domen.ru" или любой другой домен, кроме "http://site.ru", то он должен попасть в список/
Возможно ли организовать такой поиск по файлам?

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

П.С. Если кому интересно, объясню зачем мне это. В шаблоны моих сайтов напихали левых ссылок, но файлов шаблонов очень много и сайт не один. Поэтому вручную проверить все эти файлы сложно. Одну такую нашел вручную в одном из файлов, не исключено, что во многих есть...

#194530

Наверное, я не до конца понял вашу задачу, но

text

egrep 'http://domen.ru|http://domen2.ru|http://domen3.ru' List.txt | egrep -v 'http://site.ru'

...разве не найдёт такие вхождения?

#194535

Lupo Alberto, спасибо за оперативность, но нет.
Во-первых, я не знаю имен этих левых доменов. Если бы я их знал, я бы и искал именно их вхождения. Единственное, что ясно точно, что это может быть любой другой домен, кроме моего домена.
Во-вторых, насколько я понял вашу конструкцию, вы собираете сначала все файлы с вхождением левого домена, а потом исключаете с вхождением родного домена. При этом исключаться все файлы, потому что вхождение своего домена есть во всех файлах. То есть может быть, что в файле будет и свой домен "http://site.ru" и левый какой-нибудь "http://levij-sajt" и такой файл мне надо найти.

#194597

Никто я так понимаю не сможет подсказать или это очень сложная задача?

#194599

ни как не возьму в толк, чем вас конструкция из двух грепов неустраивает?
grep -r 'http://' . | grep -v 'domen.my'

#194603
Fat-Zer написал:
ни как не возьму в толк, чем вас конструкция из двух грепов неустраивает?
grep -r 'http://' . | grep -v 'domen.my'

Сейчас объясню на примере.

Имеем файл:


...
<a href="http://moj-sajt.ru">ссылка на мой сайт (все нормально)</a>
...
<a href="http://levij-sajt.ru">ссылка на левый сайт злоумышленника (все плохо, нужно отыскать и удалить)</a>
...

То ваша конструкция

text
grep -r 'http://' . | grep -v 'moj-sajt.ru'

не найдет этот файл, а мне как раз надо его найти и удалить эту левую ссылку злоумышленника. Я правильно понимаю?

Поэтому к сожалению этот вариант не прокатит?
Очень хотелось бы разобраться. Я параллельно гуглю, но найти четко ответ на такой вопрос, как вы понимаете, очень трудно, так как и запрос невозможно четко сформулировать.
Еще будут идеи?

#194605
valet написал:
не найдет этот файл, а мне как раз надо его найти и удалить эту левую ссылку злоумышленника. Я правильно понимаю?

не найдёт только если обе ссылки на одной строке...

как вариант(сварганен на коленке):

text

for I in $(find -type f); do
   if [ -n "$(cat $I | sed 's:http://moj-sajt.ru::' | grep 'http://')" ]; then
    echo $I
  fi
done

основное - cat $I | sed 's:http://moj-sajt.ru::' | grep 'http://'

#194608

grep -v есть отрицание, т. е. фильтрование.

#194739

Спасибо за помощь, работает.

Войдите или зарегистрируйтесь, чтобы ответить.