Когда использовать grep, less, awk, sed

Я вхожу в мир Linux, и на работе я все чаще использую grep . Делая это, я выясняю, что иногда это недостаточно для того, что я хочу.

Несколько дней назад я боролся с grep а мой коллега, старший администратор Linux, сказал мне использовать awk . Я был ошеломлен тем, как быстро я получил результат.

Итак, мой вопрос – когда вы выбираете использовать один над другим? Какие вопросы я могу задать себе перед тем, как работать с grep и потратить много времени, когда я мог бы сделать это с awk и сэкономить время?

One Solution collect form web for “Когда использовать grep, less, awk, sed”

sed и awk – это суперсеты grep , есть вещи, которые легче сделать с тем или другим.

grep foo можно записать sed '/foo/!d' или awk /foo/ , но подумайте:

grep -i foo должен быть sed '/[fF][oO][oO]/!d' если вы не хотите рассматривать нестандартные расширения, такие как sed '/foo/I!d' GNU. Или с awk : awk 'tolower($0) ~ /foo/' или снова с использованием расширения GNU: awk -v IGNORECASE=1 /foo/ .

То, что разные инструменты хороши и громоздки с другими инструментами:

Grep

grep – простой инструмент, но имеет очень специализированные режимы работы, которые сложнее воспроизводить с помощью awk или sed :

  • grep -i для нечувствительности к регистру (см. выше)
  • grep -Fe "$string" для фиксированного поиска строк ( export string; awk 'index($0, ENVIRON["string"])' с awk , без прямого эквивалента с sed ).
  • (нестандартный) grep -r для рекурсивного поиска
  • (нестандартный) grep -P / pcregrep для perl-подобных регулярных выражений (некоторые реализации sed имеют perl-подобную поддержку регулярного выражения, но не самые основные)
  • (не стандартный) grep -o чтобы вернуть согласованную часть (несколько строк awk или sed чтобы сделать то же самое)
  • (не стандартный) grep -A/B/C чтобы вернуть контекст вокруг матча (опять же больно делать аналогичным образом с sed или awk )

СЕПГ

  • s/foo/bar/ : команда sed имеет функции, которые трудно реализовать в awk например:
  • s/foo\(.*\)bar/\1/g : захват (хотя GNU awk имеет расширение gensub() )
  • s/foo/bar/3 : заменить третье вхождение на каждую строку
  • (нестандартное): редактирование на месте (хотя оно также поддерживается GNU awk сейчас).

AWK

awk – самая многофункциональная из трех.

  • полезно для работы с цифрами
  • хорошо для обработки входных данных, отформатированных в столбцах.
  • хорошо для извлечения и объединения данных из разных источников, с его ассоциативными массивами.

Perl

perl как практический инструмент извлечения и отчетности имеет лучшее из всех. Это то, из чего он был изначально предназначен (чтобы быть инструментом, который делает все эти sed / awk устаревшими).

Освоение perl для обработки текста дает серьезное преимущество. Я бы рекомендовал потратить некоторое время на это, даже прежде чем смотреть на менее распространенные команды sed например.

представление

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

Например, есть некоторые реализации grep или sed , которые очень быстрые, но, например, они не поддерживают многобайтовые символы, поэтому могут корректно работать только в англо-английском тексте в многобайтовых локалях. Или они быстры, потому что они работают на небольшом буфере фиксированной длины и, следовательно, не могут работать на произвольном вводе …

  • Я хочу добавить «n» строк из файла (скажем, file1) в другой файл под «n» вхождения строки в другой файл, чтобы
  • Не удается перенаправить вывод из sed
  • Добавление значения ко всем столбцам
  • sed one-liner для удаления любой строки, которая не содержит строчных букв
  • Насколько хорошо работает grep / sed / awk на очень больших файлах?
  • Добавление строки, содержащей escape-символ с sed
  • grep и найдите следующее значение:
  • sed, чтобы заменить пустую строку двумя строками содержимого
  • Замена переменной, содержащей \ with sed
  • заменяя некоторый текст квадратными скобками в bash
  • как я могу прокомментировать / в разделе в исходном коде с sed или awk
  • Interesting Posts

    В сценарии bash, как я могу использовать «tr -d» для удаления введенного пользователем символа?

    Linux на внешнем USB-накопителе не загружается на другие компьютеры

    как редактировать двуязычный текст с помощью скриптов?

    Загрузка файла через SSH с помощью «прокси» машины между ними

    Что мне нужно для добавления виртуального адаптера IPsec?

    взаимодействуя с модулями ядра без предоставления пользователям доступа sudo?

    Способы определения, какие (конфигурационные) файлы считываются исполняемым при запуске

    сравнить столбцы в одном файле и распечатать количество совпадений

    Нужен ли загрузочный раздел в UEFI & Luks?

    Упаковка Debian с зависимостью (с нуля)

    vim -d показать только различия

    Как получить разрешение файла в восьмеричном

    Как узнать, ACL поддерживаются в моей файловой системе?

    Двойная путаница монитора в Ubuntu Gnome 17.10

    Есть ли программа «терминала», которая говорит с сервером через http?

    Linux и Unix - лучшая ОС в мире.