Нужно найти все файлы, где встречаются строки, которые начинаются по первому критерию, но не продолжаются по второму критерию.
Объяснить такое мне очень сложно, поэтому покажу на примере.
Нужно найти все файлы, в которых есть вхождение "http://", после которого идут любые символы кроме заданных. Например заданные это "site.ru". То есть если в файле присутствует например вхождение "http://domen.ru" или любой другой домен, кроме "http://site.ru", то он должен попасть в список/
Возможно ли организовать такой поиск по файлам?
Использую часто для поиска конструкцию grep -rl "текст" *, но как построить с помощью регулярных выражений нужную мне - понятия не имею.
Помогите разобраться...
П.С. Если кому интересно, объясню зачем мне это. В шаблоны моих сайтов напихали левых ссылок, но файлов шаблонов очень много и сайт не один. Поэтому вручную проверить все эти файлы сложно. Одну такую нашел вручную в одном из файлов, не исключено, что во многих есть...
Сложный поиск текста в файлах
Наверное, я не до конца понял вашу задачу, но
egrep 'http://domen.ru|http://domen2.ru|http://domen3.ru' List.txt | egrep -v 'http://site.ru'
...разве не найдёт такие вхождения?
Lupo Alberto, спасибо за оперативность, но нет.
Во-первых, я не знаю имен этих левых доменов. Если бы я их знал, я бы и искал именно их вхождения. Единственное, что ясно точно, что это может быть любой другой домен, кроме моего домена.
Во-вторых, насколько я понял вашу конструкцию, вы собираете сначала все файлы с вхождением левого домена, а потом исключаете с вхождением родного домена. При этом исключаться все файлы, потому что вхождение своего домена есть во всех файлах. То есть может быть, что в файле будет и свой домен "http://site.ru" и левый какой-нибудь "http://levij-sajt" и такой файл мне надо найти.
Никто я так понимаю не сможет подсказать или это очень сложная задача?
ни как не возьму в толк, чем вас конструкция из двух грепов неустраивает?
grep -r 'http://' . | grep -v 'domen.my'
ни как не возьму в толк, чем вас конструкция из двух грепов неустраивает?
grep -r 'http://' . | grep -v 'domen.my'
Сейчас объясню на примере.
Имеем файл:
...
<a href="http://moj-sajt.ru">ссылка на мой сайт (все нормально)</a>
...
<a href="http://levij-sajt.ru">ссылка на левый сайт злоумышленника (все плохо, нужно отыскать и удалить)</a>
...
То ваша конструкция
grep -r 'http://' . | grep -v 'moj-sajt.ru' не найдет этот файл, а мне как раз надо его найти и удалить эту левую ссылку злоумышленника. Я правильно понимаю?
Поэтому к сожалению этот вариант не прокатит?
Очень хотелось бы разобраться. Я параллельно гуглю, но найти четко ответ на такой вопрос, как вы понимаете, очень трудно, так как и запрос невозможно четко сформулировать.
Еще будут идеи?
не найдет этот файл, а мне как раз надо его найти и удалить эту левую ссылку злоумышленника. Я правильно понимаю?
не найдёт только если обе ссылки на одной строке...
как вариант(сварганен на коленке):
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://'
grep -v есть отрицание, т. е. фильтрование.
Спасибо за помощь, работает.