Какая связь между sed, grep, find, awk, gawk, какой из них предпочтительнее? - PullRequest
5 голосов
/ 21 декабря 2010

Я новичок в Linux / Unix. Я считаю, что с помощью этих команд можно решить некоторые задачи. Есть ли какая-то связь между ними? Или какой из них предпочтительнее? Какой из них устарел?

Спасибо.

Ответы [ 5 ]

8 голосов
/ 21 декабря 2010

См. SO 366980 для обсуждения различий между Perl, Python, Awk и Sed.

В списке из пяти есть четыре отдельные команды; awk и gawk тесно связаны, причем GNU Awk является реализацией GNU для Awk.

  • find предназначен для размещения файлов в наборе каталогов на основе таких характеристик файла, как имя или время изменения. GNU Find обладает гораздо большими возможностями, чем традиционная или POSIX-версия Find.

  • grep предназначен для поиска содержимого в файлах с использованием регулярных выражений для управления выбранным. GNU Grep имеет гораздо больше возможностей, чем традиционная или POSIX-версия Grep.

  • sed предназначен для изменения содержимого файлов с помощью команд редактирования, включая регулярные выражения. GNU Sed имеет гораздо больше возможностей, чем традиционная или POSIX-версия Sed.

  • awk - язык сопоставления с образцом и форматирования. Это язык программирования в отличие от других упомянутых вами инструментов. При необходимости это очень полезно. Тем не менее, Perl и Python также имеют возможности Awk и многих дополнительных функций, поэтому многие люди используют их вместо Awk. GNU Awk имеет несколько больше возможностей, чем традиционная или POSIX-версия Awk.

Итак, инструменты, которые вы перечислили, выполняют разные задачи, но могут работать вместе разными способами. Еще один инструмент, о котором вам следует знать, это xargs, который принимает списки файлов и запускает указанную команду для каждого из файлов по очереди.

4 голосов
/ 21 декабря 2010

AWK - это язык программирования, разработанный Ахо, Вайнбергером и Керниганом. gawk является одной реализацией AWK, но есть несколько других, включая mawk и nawk. Это полноценный язык программирования с переменными, управляющими структурами и ассоциативными массивами, но в целом оптимизированный для работы с видами текстовых данных, обычно встречающихся в системах UNIX.

sed - это потоковый редактор, вдохновленный ed редактором. Он имеет простой набор команд, в основном ограниченный построчным редактированием. sed команды могут быть легко имитированы в awk. Следующее эквивалентно:

sed -e 's/foo/bar/g'
awk '{ gsub(/foo/, "bar"); print $0 }'
awk '{gsub(/foo/,"bar")}1'

grep находит текст. Основные функции grep можно легко имитировать в sed и awk. Следующее эквивалентно:

grep 'foo.bar'
sed -n -e '/foo.bar/p'
awk '/foo.bar/ { print $0 }'
awk '/foo.bar/'

Упс, пропущено find.

find обходит дерево файловой системы, выполняя действия по заданному критерию. Например,

find . -name '.*' -prune -o ! -name '*~' -type f -exec cat '{}' \;

будет проходить все файлы и каталоги, начиная с текущего каталога ., исключая (и не переходя в) любые каталоги с именами, начинающимися с ., и запускать cat для каждого файла, имя которого не заканчивается на ~ (с результатом распечатки содержимого этого файла). Опять же, это было бы выполнимо в AWK или Perl или во многих других языках программирования (или даже в чистой оболочке, в этом примере), но проще и быстрее писать и понимать с помощью специального инструмента.

3 голосов
/ 21 декабря 2010

Различные инструменты для разных работ.Вопрос звучит так: «Какой инструмент лучше: молоток, отвертка или плоскогубцы?»

grep - найти / отфильтровать текст в файле / потоке.Строка совпадает / не совпадает - передайте ее на выход.Используйте, чтобы уменьшить количество продукции до того, что вам нужно.Обычно используется в интерактивном режиме, если вы получаете слишком много информации.Также часто используется в сценариях для извлечения «одной строки, содержащей то, что мне нужно»

Обычно после использования сценария grep вы видите либо awk (либо сложное выражение, либо просто программист старой школы), либо cut (то естьгораздо быстрее, но довольно упрощенно) извлечь одно значение.(grep рубит по горизонтали, cut / awk рубит по вертикали)

Использование awk для полнофункционального программирования в настоящее время практически невидимо.

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

find - найти файлы, соответствующие заданным (расширенным) параметрам.

2 голосов
/ 21 декабря 2010

Эти инструменты делают разные вещи, поэтому какой из них предпочтительнее, зависит от того, что вы хотите сделать.

Из упомянутых вами инструментов find немного отличается от других - он работает на файловых системах.для поиска файлов с определенными атрибутами (имя, дата, права доступа ...).

sed и grep принимают текстовые файлы в качестве входных данных, обрабатывают их и выводят результаты.Они оба активно используют регулярные выражения.sed («Stream EDitor») обычно используется для операций поиска и замены.grep («Global Regular Expression Print») выводит строки в текстовом файле, которые соответствуют некоторому шаблону.

В системах Linux awk и gawk обычно являются разными именами для одной и той же программы, GNUверсия AWK (названа в честь ее создателей "Ахо, Вайнбергер, Керниган").awk также может ссылаться на «классическую» версию awk, которая не имеет расширений GNU, и есть другие варианты nawk («новый awk») и mawk («AWK Майка»).awk делает гораздо больше, чем сопоставление с образцом;это действительно полноценный язык программирования, хотя он предназначен для разбиения входного текста на строки и поля и работы с ними (включая числовые операции, поэтому легко выполнять такие вещи, как суммирование столбцов или статистические вычисления).

1 голос
/ 21 декабря 2010

Перечислено в порядке того, как часто я их использую, с комментариями. Для получения более подробной информации, попробуйте man command, например, man grep в командной строке для получения более подробной информации.

grep - печатать строки, соответствующие шаблону * Лично я считаю это наиболее полезным.

grep foo *.txt
grep 192.168.1.1 output.log
grep -i steve */*.txt 

найти - просмотреть файловую иерархию * можно использовать для поиска файлов в подкаталогах или выполнять команды оболочки для файлов

find . -name lost.txt -print
find . -name "*.txt" -print
find . -type f -exec chmod 0644 {} \;

sed - потоковый редактор * помогает автоматизировать простое редактирование текста в пакетах файлов

sed "s/abc/ABC/" foo.txt

awk - язык сканирования и обработки по шаблонам * долгое время не использовал его. Если доходит до того, что мне нужно использовать awk, я обычно использую что-то вроде Ruby.

...