Я вхожу в мир Linux и на работе использую grep
все больше и больше. Делая это, я понимаю, что иногда это не соответствует тому, что я хочу.
Я боролся с grep
несколькими днями назад, и мой коллега, который является старшим администратором Linux, сказал мне использовать awk
. Я был ошеломлен тем, как быстро я получил результат.
Поэтому мой вопрос: когда вы решите использовать один поверх другого? Какие вопросы я могу задать себе, прежде чем приступить к работе grep
и потратить много времени, когда я мог бы это сделать awk
и сэкономить время?
less
для просмотра файла. Используйтеgrep
для поиска в файле. Используйтеsed
для редактирования файла. Используйтеawk
сноваgrep
иsed
когда файл, который вы хотите обработать, имеет какую-то структуру (например, столбцы). Используйтеsed
over,awk
когда вы в основном хотите иметь дело со строками (например, удалить или добавить строки текста). Я уверен, что кто-то напишет ответ на 20 страницах, который будет более полным, чем мой.Ответы:
sed
иawk
есть надмножестваgrep
, есть вещи, которые легче сделать с одним или другим.grep foo
можно написатьsed '/foo/!d'
илиawk /foo/
, но рассмотрим:grep -i foo
должно быть,sed '/[fF][oO][oO]/!d'
если вы не хотите рассматривать нестандартные расширения, такие как GNUsed '/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
'ss
имеет функции, которые трудно реализовать,awk
например:s/foo\(.*\)bar/\1/g
: capturing (хотя в GNU awk естьgensub()
для этого расширение)s/foo/bar/3
: заменить 3-е вхождение в каждой строкеawk
).AWK
awk
является наиболее функциональным из трех.Perl
perl
в качестве практического инструмента извлечения и отчетности имеет лучшее из всех. Это то, что он был изначально разработан для (чтобы быть инструментом , который делает все теsed
/awk
устаревшие).Умение
perl
выполнять обработку текста дает серьезное преимущество. Я бы посоветовал потратить на это некоторое время, даже прежде чем, например, взглянуть на менее распространенныеsed
команды.производительность
Как правило, чем более специализирован инструмент, тем эффективнее он выполняет свою задачу. Но это также очень сильно зависит от реализации, задачи и некоторых других факторов и производительности могут иметь компромиссы, которые, возможно, необходимо принимать во внимание.
Например, есть некоторые
grep
илиsed
очень быстрые реализации, но, например, они не поддерживают многобайтовые символы, поэтому могут корректно работать только с англо-американским текстом в многобайтовых локалях. Или они быстрые, потому что работают с небольшим буфером фиксированной длины и, следовательно, не могут работать с произвольным вводом ...источник
awk
намного быстрее, чемgrep
.mawk
известно, что он очень эффективен (но не поддерживает многобайтовые символы, что является одной из причин, почему он более эффективен, чем некоторые другие инструменты)