Когда использовать grep, less, awk, sed [закрыто]

17

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

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

Поэтому мой вопрос: когда вы решите использовать один поверх другого? Какие вопросы я могу задать себе, прежде чем приступить к работе grepи потратить много времени, когда я мог бы это сделать awkи сэкономить время?

frankguthrie
источник
Это хороший вопрос, но он действительно очень широкий и в первую очередь основан на мнениях. Чтобы ответить на ваш вопрос, использование grep вместо awk действительно зависит от того, насколько удобно вы используете awk / sed. Есть несколько причин, по которым можно использовать это поверх последнего, например, поиск чего-то более конкретного, чем то, что может предложить grep, или если вы пытаетесь заменить / отредактировать файлы определенной строкой (используя sed). Но опять же, все зависит от вашего уровня комфорта и опыта использования awk / sed.
ryekayo
7
Используйте lessдля просмотра файла. Используйте grepдля поиска в файле. Используйте sedдля редактирования файла. Используйте awkснова grepи sedкогда файл, который вы хотите обработать, имеет какую-то структуру (например, столбцы). Используйте sedover, awkкогда вы в основном хотите иметь дело со строками (например, удалить или добавить строки текста). Я уверен, что кто-то напишет ответ на 20 страницах, который будет более полным, чем мой.
Satō Katsura
Привет Сато, Это не о длине, а о том, что сказано. И вы несколько строк очень информативны. Спасибо.
Франкфурт

Ответы:

25

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

grep fooможно написать sed '/foo/!d'или awk /foo/, но рассмотрим:

grep -i fooдолжно быть, sed '/[fF][oO][oO]/!d'если вы не хотите рассматривать нестандартные расширения, такие как GNU sed '/foo/I!d'. Или с 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для sedрегулярных выражений типа perl (некоторые реализации имеют поддержку регулярных выражений типа perl, хотя и не самые основные)
  • (нестандартный), grep -oчтобы вернуть совпавшую часть (несколько строк awkили sedсделать то же самое)
  • (нестандартно) grep -A/B/Cдля возврата контекста вокруг матча (опять же больно делать аналогичным образом с sedили awk)

СЭД

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

AWK

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

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

Perl

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

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

производительность

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

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

Стефан Шазелас
источник
Отличный ответ! Знаете ли вы об эффективности инструментов? Я запутался в заявлении ОП, это awkнамного быстрее, чем grep.
pfnuesel
@pfnuesel, это очень сильно зависит от реализации и схемы использования. Например, mawkизвестно, что он очень эффективен (но не поддерживает многобайтовые символы, что является одной из причин, почему он более эффективен, чем некоторые другие инструменты)
Стефан Шазелас