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
очень быстрые реализации, но, например, они не поддерживают многобайтовые символы, поэтому могут корректно работать только с англо-американским текстом в многобайтовых локалях. Или они быстрые, потому что работают с небольшим буфером фиксированной длины и, следовательно, не могут работать с произвольным вводом ...