- Заметки Лёвика
- web программирование, администрирование и всякая всячина, которая может оказаться полезной
- linux — массовый поиск и замена в файлах
- Поиск файлов по размеру
- Комментарии (3) к записи “linux — массовый поиск и замена в файлах”
- sed и замена символов в большом файле
- linux-notes.org
- Найти и заменить текст в файле с помощью команд
- питон
- Как заменить строку в файле в Bash
- Заменить строку в файле командой `sed`
- Пример 1: заменить файл командой sed
- Пример 2: Замена файла командой sed с флагом g и i
- Пример 3. Замена файла командой sed и шаблоном совпадающих цифр
- Заменить строку в файле командой awk
- Пример 4: заменить файл командой awk
- Вывод
Заметки Лёвика
web программирование, администрирование и всякая всячина, которая может оказаться полезной
linux — массовый поиск и замена в файлах
Поиск текста по файлам в Linux:
grep -rl ‘text’ /var/www/
— ищем файлы, в которых имеется ‘text’
grep -rl ‘text’ ./
— то же, но в текущей категории..
Поиск и удаление файлов, содержащих строку
78.46.14.162
find /var/named/ -type f -exec grep «MX» <> ; -print | grep named
(имя файла и найденный текст)
find . -name ‘*.*htm*’ -exec grep -i iframe <> ; -print | less
ищем iframe (файлы, перезаписанные вирусом).
Массовый поиск и замена в файлах:
«s/search text/replace text/g» index.php
i
— флаг, указывающий на то, что оригинальный файл будет сохранен как file.ext
g — заменяем не только первое вхождение
поиск и замена в нескольких файлах с использованием perl
perl -pi
-e ‘s/foo/bar/’ [files]
Поиск и замена с использованием sed (ищем скрипт и заменяем его на комментарий. Экранируем восклицательный знак:
sed -i.
«s/≶script>var k;.*script>/≶\!— deleted —>/g» index.php
Флаг -i (inplace) означает, что результат следует сделать в файле. При наличии символов после -i резервная копия сохраняется в соответствующий файл (некоторые системы не дают выполнить команду с флагом -i без сохранения резервной копии).
Для удобства дальнейшего удаления использую -i.
(можно -i.bak — сохранит файлы, добавляя расширение bak). Дальнейшее удаление при помощи команды find + delete
find ./ -name ‘*.
Пригодилось при замене вирусных кодов на сайте — первым этапом поиск файлов, затем — дальнейшая замена. В принципе, можно сделать всё одним махом. В случае замены флаг -i
Подсчет количества конкретных слов в файле:
http://www.linux.org.ru/forum/general/5120319
Поиск строки с указанием её номера grep -n ‘needle’ file.txt
Просмотр файла, начиная со строки 532
more +532 file.txt
Массовое переименование файлов в linux — rename регулярка (/что заменять/на что заменять/ в каких файлах)
rename «s/.JPG/.jpg/g» *.JPG
http://www.cyberciti.biz/tips/renaming-multiple-files-at-a-shell-prompt.html
Поиск файлов по размеру
Для удаления файлов, найденных командой find достаточно указать дополнительный параметр -delete
Поиск php файлов размером 535 байт (c — указывает на размер в байтах, по умолчанию — в блоках 512)
find ./ -type f -name ‘*.php’ -size 599c
При указании размера со знаком плюс или минус — происходит поиск файлов соответственно больше или меньше указанного значения.
Поиск подстроки в недавно модифицированных файлах (40 дней назад ! минус перед числом обязателен):
find ./ -name «*.php» -mtime -40 -exec grep «breadcrumb» <> \;
Поиск файлов find + последующий grep для них (find + exec grep).. во второй строчке — ещё и удаление
find ./ -type f -name ‘*.php’ -size 599c -exec grep -l «c1120ba44a14664ed80cfa5a18832c1b9b39dec0» <> \;
find ./ -type f -size 599c -exec grep -l «c1120ba44a14664ed80cfa5a18832c1b9b39dec0» <> \; -delete
Поиск файлов больше мегабайта (+1M) меньше (-1M)
find ./ -type f -size +1M
Поиск файлов с нулевой длиной
find ./ -type f -size 0
Поиск и удаление файлов с нулевой длиной (вторым парамтером — путь к каталогу.. ./ означает текущий
find ./ -type f -size 0 -delete
Поиск номеров строк в файле (чтобы grep вывел номер строки — используем с параметром -n)
Чтобы вытащить определённые строки из файла (или удалить строки в начале файла и в конце файла), можно использовать sed — выведет строки с 4 по 17
sed -n ‘3,10p’ file.txt
Переместить файлы размером >2Mb в каталог /tmp (и вообще выполнить любую команду с файлами)
find ./ -size +2M -exec cp <> /tmp \;
Ресайз всех изображений в каталоге, размер которых превышает 2М
find ./ -size +2M -exec convert <> -resize 1200×1200 <> \;
Ресайз всех изображений, по маске
find ./ -name ‘493_*’ -exec convert <> -resize 1200×1200 <> \;
Рекурсивно удалить все .svn директории в подкаталогах
find . -name «.svn» -exec rm -rf <> \;
Метки: linux
Опубликовано Суббота, Май 29, 2010 в 23:17 в следующих категориях: Без рубрики. Вы можете подписаться на комментарии к этому сообщению через RSS 2.0. Вы можете добавить комментарий, или trackback со своего сайта.
Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)
html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)
ссылка (для отправки по почте)
Комментарии (3) к записи “linux — массовый поиск и замена в файлах”
Спасибо, очень помогло. Но в Массовый поиск и замена в файлах:… пришлось заменить кавычки на фигурные скобки. Пробовал в OpenSuSE 11.4.
Разные “времена” файла
find -name “*.*” -mtime -40 -mtime +2
find -name “*.*” -ctime -40 -ctime +2
Источник
sed и замена символов в большом файле
Здравствуйте Столкнулся с проблемой что sed не отрабатывает на файле размером 15 гигабайт, на части этого файла отрабатывает. Не отрабатывает это значит что-то делает, ошибок нет, но файл не меняется.
задача была такая 1. заменить \n на ‘,’ «концов строки» может быть несколько \n\n\n а запятая нужна одна, в самом конце запятая не нужна 2. в начале файла воткнуть 1 символ 3. в конец файла воткнуть 1 символ
в итоге файл с 111111 222222 333333
нужно было переделать в [11111,22222,33333] не меняя имени файла
нашел такие варианты(возможно не самые лучшие) sed -i -r ‘:a;N;$!ba;s/\n+/,/g’ FILE; sed -i -e ‘1 s/^/[/;’ FILE; echo «]» >> FILE
попробовал 1000 строк и 3 гигабайта и уже на этом объеме проблема, попробую найти размер с которого начинается проблема
ЕМНИП, sed с ключем -i делает копию файла в /tmp, соотвественно, если /tmp у тебя смонтирован в память, то большой файл туда просто не влезает.
Насколько я помню (возможно ошибаюсь), единственный способ заставить sed обрабатывать файлы не построчно (чтобы заменять \n) приводит к тому, что весь файл загружается в память. Так что для больших файлов твой подход может не работать.
Попробуй лучше вот так:
нет не в память, места много, похоже граница проблем проходит по отметке 2Gb
даже если смотреть глазами и рефрешить папку видно ,что создается бакап файл, он увеличивается в размерах, добегает до конца и исчезает.
он создает временный файл в /tmp, потом перезаписывает, сделай явно sed . > /раздел-заведомо-с-достаточным-местом/файл
Не, так всё равно выжирает память. Не могу придумать как при помощи sed обрабатывать файлы по несколько гигабайт на строку. Видимо проще будет решить твою задачу небольшой программой на C или любом другом нормальном ЯП.
похоже граница проблем проходит по отметке 2Gb
ну может еще в файле слишком длинная строка в этом месте, можно попробовать проверить: awk ‘(b=length($0)) > a END
одна строка это десятки MGB а вот сам файл десятки Gb это сервер, на нем 32Gb памяти
Источник
linux-notes.org
Недавно столкнулся с проблемой, мне нужно было найти определенные слова в файлах и заменить их на нужный мне текст. Немного поискав в интернете, я нашел как это сделать, по этому решил записать заметку «Поиск и замена слов в файлах linux», пригодится как мне так и другим пользователям. Это можно сделать командой find и grep с некоторыми параметрами.
Простой поиск с использованием grep:
Поиск и замена текста в файлах:
Удаление определенного символа из файлов
Нужно символы прописывать в уникоде, если правильно понял.
Как заменить слово в файлах при рекурсивном поиске Linux?
Этой строкой мы ищем во всех файлах с разрешением *.py от текущей директории строку text_1 и заменяя ее наtext_2, так же можно использовать regexp выражения.
Еще примеры
Для начала делаем поиск по фразе которая нам необходима, нам покажет все файлы и в каких строках содержится данная фраза:
или для конкретных файлов:
Выполнить замену можно еще следующим образом:
Допустим, Вам необходимо выполнить замену целой строки ( закомментировать какую либо функцию, добавив // перед самой функцией), то можно это сделать:
Экранируем спец символы и заменяем на любую другую строку, для этого:
Данная команда заменит одну строку на другую во всех файлах.
Упрощенная версия ее:
Можно удалить многострочное содержание текста который находиться, например между //###==### и //###==###
То чтобы удалить все строки кода между данными комментариями, выполните:
Я делал сканирование maldet и нашел много вредоносного кода, по этому, я удалил его так:
Как заменить всю строку на другую? Та вот так можно:
Или тоже самое, но через переменные:
-===Пример===-
Предположим, имеется файл и в нем находится:
Но по заданию, нужно чтобы было — Three.Two.One
Для этого, выполним:
PS: О долбанном SED-е я расскажу очень не скоро, он меня реально бесит и злит. Кто ее придумал, реальный сука ДЖЕДАЙ 😀
Делаю замену версий в Terraform так:
Делаем замену другим способом:
ПРИМЕЧАНИЕ! Утилиту rpl необходимо установить.
Я попозже постараюсь привести еще примеров и рассказать о утилите в своей новой статье.
Когда не удобно искать файлы в консольном режиме и есть GUI интерфейс, то можно воспользоваться утилитой regexxer.
Debian/Ubuntu/Mint:
CentOS/RedHat/Fedora:
Очень простая и хорошая утилита, я сам ею пользовался и тестировал на своей виртуальной машине на Debian.
На этом моя короткая заметка «Поиск и замена слов в файлах linux» завершена и готова к использованию.
Источник
Найти и заменить текст в файле с помощью команд
Как я могу найти и заменить определенные слова в текстовом файле, используя командную строку?
- sed = Stream EDitor
- -i = на месте (т.е. сохранить обратно в исходный файл)
- s = команда замены
- original = регулярное выражение, описывающее слово для замены (или только само слово)
- new = текст для замены
- g = глобальный (т.е. заменить все, а не только первое вхождение)
file.txt = имя файла
Есть несколько разных способов сделать это. Один использует sed и Regex. SED — это потоковый редактор для фильтрации и преобразования текста. Один пример выглядит следующим образом:
Другой способ , который может иметь больше смысла , чем и > strout является с трубами!
Есть множество способов достичь этого. В зависимости от сложности того, чего можно достичь с помощью замены строки, и в зависимости от инструментов, с которыми пользователь знаком, некоторые методы могут быть предпочтительнее других.
В этом ответе я использую простой input.txt файл, который вы можете использовать для проверки всех примеров, представленных здесь. Содержимое файла:
Bash на самом деле не предназначен для обработки текста, но простые замены могут быть выполнены с помощью расширения параметров , в частности, здесь мы можем использовать простую структуру $
Этот небольшой скрипт не выполняет замену на месте, это означает, что вам придется сохранить новый текст в новый файл и избавиться от старого файла, или mv new.txt old.txt
Примечание: если вам интересно, почему while IFS= read -r ; do . done он используется, то в основном это способ чтения файла строка за строкой. Смотрите это для справки.
AWK, будучи утилитой обработки текста, вполне подходит для такой задачи. Он может делать простые замены и намного более сложные, основанные на регулярных выражениях . Он обеспечивает две функции: sub() и gsub() . Первый из них заменяет только первое вхождение, а второй — заменяет вхождения во всей строке. Например, если у нас есть строка one potato two potato , это будет результат:
AWK может принять входной файл в качестве аргумента, поэтому input.txt было бы легко сделать то же самое с :
В зависимости от версии AWK, которая у вас есть, она может иметь или не иметь редактирование на месте, поэтому обычная практика — сохранять и заменять новый текст. Например что-то вроде этого:
Sed — это редактор строк. Он также использует регулярные выражения, но для простых замен достаточно сделать:
Что хорошо в этом инструменте, так это то, что он имеет редактирование на месте, которое вы можете включить с -i флагом.
Perl — это еще один инструмент, который часто используется для обработки текста, но это язык общего назначения, который используется в сетях, системном администрировании, настольных приложениях и во многих других местах. Он заимствовал много концепций / функций из других языков, таких как C, sed, awk и другие. Простую замену можно сделать так:
Как и у sed, у perl также есть флаг -i.
питон
Этот язык очень универсален и также используется в самых разных приложениях. Он имеет много функций для работы со строками, среди которых есть replace() , так что если у вас есть переменная, как var=»Hello World» , вы могли бы сделать var.replace(«Hello»,»Good Morning»)
Простой способ прочитать файл и заменить строку в нем будет так:
Однако в Python вам также нужно выводить в новый файл, что вы также можете сделать из самого скрипта. Например, вот простой:
Источник
Как заменить строку в файле в Bash
Главное меню » Linux » Как заменить строку в файле в Bash
Заменить строку в файле командой `sed`
Базовый синтаксис команды ‘sed’ для замены конкретной строки в файле приведен ниже.
Каждая часть приведенного выше синтаксиса объясняется ниже.
Параметр ‘-i‘ используется для изменения содержимого исходного файла с заменой строки, если строка поиска существует в файле.
‘s‘ указывает заменяющую команду.
search_string содержит строковое значение, которое будет искать в файле для замены.
replace_string содержит строковое значение, которое будет использоваться для замены содержимого файла, соответствующего значению search_string .
‘filename‘ содержит имя файла, в котором будет применяться поиск и замена.
Пример 1: заменить файл командой sed
В следующем скрипте текст для поиска и замены будет взят у пользователя. Если строка поиска существует в Sales.txt, она будет заменена строкой замены. Здесь будет выполняться поиск с учетом регистра.
Пример 2: Замена файла командой sed с флагом g и i
Следующий сценарий будет работать так же, как и предыдущий пример, но в строке поиска будет производиться глобальный поиск флага «g», а поиск без учета регистра будет выполняться для флага «i».
Пример 3. Замена файла командой sed и шаблоном совпадающих цифр
Следующий сценарий выполнит поиск всего числового содержимого в файле и заменит содержимое, добавив символ «$» в начале чисел.
Заменить строку в файле командой awk
Команда awk – это еще один способ заменить строку в файле, но эта команда не может обновить исходный файл напрямую, как команда sed.
Пример 4: заменить файл командой awk
Следующий скрипт сохранит обновленное содержимое в файле temp.txt, который будет переименован в исходный файл.
Вывод
В этой статье показано, как использовать сценарии bash для замены определенных строк в файле. Задача по замене строки в файле станет для вас проще после отработки приведенных выше примеров.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник