Используем инструменты: Grep, Xargs и Sed

Используем инструменты: Grep, Xargs и Sed

Недавно я был вдохновлен на написание этого поста после того когда я наткнулся на ситуации когда мне нужно было отредактировать несколько файлов из проекта и заменить одни слова на другие. Раньше я это делал через Notepad++ (CTRL + H), но это хорошо если мы знаем в каком файле нам надо заменить слово, а если этих файлов тысячи. Так вот я хочу вам представить 3 базовых инструмента системы UNIX на сегодняшний день: grep, xargs, и sed.

Вы могли уже слышать они и раньше и уже знаете как ими пользоваться то вы но верно ничего нового уже не узнаете. Но если вы хотите узнать основы по использованию этих инструментов читайте дальше.

Grep

Grep является базой Unix командной для поиска фраз как из стандартного потока так и файлов. Grep возвращает информацию по файлам которые содержат вашу фразу и немного информации о том, где они находятся. Вот пример стандартного способа использование Grep:

grep 'footer' index.html

Теперь добавим несколько опции для поиска:

  • i - Игнорирует регистр символов при сравнениях.
  • n - Выдает перед каждой строкой ее номер в файле.
  • b - Выдает номер столбца в найдено файле.
grep -i -n -b 'footer' index.html

А теперь поиск по цельным словам:

  • w - Ведет поиск по цельным словам. Например при обычном поиске строки text grep может найти слово textarea. А если используется данный ключ то будут найдены только строки где есть слово text.
grep -w 'text' index.html

Поиск по файлу это хорошо но лучше если мы сможем искать файлы рекурсивно по проекту.

  • r - Рекурсивный поиск файлов из текущей директории.
  • l - Выдает только имена файлов, содержащие искомое значение.
grep -r -l 'footer' ./

А теперь попробуем вывести файлы в которых нет искомого значения.

  • L - Выводит имена файлов в которых нету искомого значения.
grep -r -L -i  'footer' ./

Также очень часто нам надо искать в конкретных типах файлов данное значения.

  • –include=«PATTERN» - Поиск в файлах по заданному шаблону
grep -r --include="*.html" -l  'footer' ./

Поиск по файлам которые начинаются на index и заканчиваются на .php

grep -r --include="index*.php" -l  'footer' ./

Теперь давайте передадим результат работы в файл.

grep -r -l  'footer' ./ > out.txt

Xargs

Это удивительная команда работает по прицепу, берет данные из стандартного ввода или из файла, разбивает их в соответствии с указанными параметрами, а затем передает другой программе в качестве аргумента. Xargs выполняется до тех пор пока данные из потока не исчерпаны. Теперь давайте рассмотрим несколько простых примеров.

Разбивай стандартный поток на аргументы.

  • –n - Указываем количество возвращаемых аргументов.
echo 1 2 3 4 | xargs -n 1

Теперь зададим разделитель аргументов.

  • –d - Указывает на разделитель для вывода аргументов.
echo '1-2-3-4' | xargs -d '-' -n 1

Вот более интересный пример где xargs используется для передачи файлов которых надо удалить.

find . -name "*.txt"| xargs rm -rf

Вся суть использования xargs это дробления входящих аргументов для последующей передачи аргументов другим программам.

Sed

Sed - это потоковый редактор который принимает текст либо с стандартного потока, либо из текстового файла, выполняет некоторые операции над строками и затем выводит результат на стандартный вывода или в файл. Как правило, в сценариях, sed используется в конвейерной обработке данных, совместно с другими командами и утилитами.

Делаем простую замену строк из файла text.txt и сохраняем в файл out.txt.

sed 's/text/test/g' text.txt > out.txt

А теперь сохраним все изменения в текущий файл.

  • i - для записи изменений в текущий файл.
sed -i 's/text/test/g' text.txt

Комбинируем все вмести

Комбинируя эти три команды, которые являются общими для всех unix систем, мы можем сделать довольно мощный сценарий для замены текста. Большая часть действий происходит от использования команды sed, но другие команды являются вспомогательным для построения запроса. Теперь давайте рассмотрим пример использования всех трех программ вымести:

grep -r -l 'foo' ./ | xargs sed -i 's/foo/bar/g'

Таким образом мы смогли заменить все foo на bar используя простую комбинацию из этих программ.

Теперь когда мы узнали основы по работе таких замечательных инструментах как grep, xargs и sed. Мы сможем писать более продвинутых сценарии для наших задач.