Ознакомьтесь с общим выпуском для систем Debian. И SID (нестабильный) , в частности:
Короче говоря: большая часть вашего программного обеспечения не будет работать (вам ДЕЙСТВИТЕЛЬНО нужна самая последняя версия программного обеспечения? Особенно, если оно содержит ошибки? Если да, вы можете установить его вручную + вы можете добавить репозитории предыдущих, более стабильных выпусков в свой /etc/apt/sources.list
, скомпилировать программное обеспечение самостоятельно и т. д.), и вы не получите своевременных обновлений безопасности. Вполне может пройти ОЧЕНЬ долгое время, прежде чем SID станет стабильным, потому что команда Debian «не устанавливает никаких сроков» (что с их энтузиазмом, «открытым исходным кодом» и прочим джазом). Они «готовы, когда они готовы».
Я пользователь Debian Jessie.
Всего наилучшего! Продолжайте взламывать!
В данном конкретном случае лучше использовать второй вариант.
Как правило, более эффективно минимизировать количество утилит в конвейере. Лучше не разветвлять (запускать) ненужные процессы (как в вашем первом примере с ненужным процессом sed
).В Интернете нетрудно найти примеры жалоб на бесполезное использование cat.
В большинстве современных Unix-подобных систем* разветвление осуществляется достаточно эффективно, но это зависит от размера запускаемого процесса, например, запуск perl
или python
будет намного медленнее, чем sed
или awk
.
Для однократных команд это не имеет большого значения, но если конвейер находится внутри цикла и выполняется много раз, удаление ненужного процесса из конвейера может значительно ускорить общее время выполнения.
Почему я должен запускать один из них?
Если вы лучше знакомы с синтаксисом одного над другим, это может быть лучше для читаемости кода (и ремонтопригодности) использовать инструмент/язык вы наиболее знакомы с.
Должен ли я использовать другой инструмент?
В данном конкретном случае я бы так не думал. Оба awk
и sed
являются
подходящие инструменты для такого рода работ.
Какие факторы следует учитывать?
Если вам нужно обрабатывать несколько файлов (например, в цикле), то скорость/эффективность будут важны.
Если вы время от времени обрабатываете один большой файл, удобочитаемость кода может быть важнее.
Как я могу проверить эти факторы?
Вы можете профилировать разные версии с помощью утилиты time
, доступной как встроенная оболочка с Bash, но также и как отдельная исполняемая программа. Например. выполнение двух примеров команд показывает, что первый пример занял .012s длиннее второго.
$ time echo "foo\nbar\nbaz" | sed 1q | awk '{ print $0 " cats" }'
foo\nbar\nbaz cats
real 0m0.056s
user 0m0.000s
sys 0m0.045s
$ time echo "foo\nbar\nbaz" | awk 'NR == 1 { print $0 " cats" }'
foo\nbar\nbaz cats
real 0m0.044s
user 0m0.000s
sys 0m0.031s
Обратите внимание, что на профилирование тестов влияет нагрузка на систему и другие ограничивающие факторы, поэтому вам придется повторять это большое количество раз, чтобы получить истинное представление о том, какая версия быстрее другой.
*В MS Windows разветвление обходится дороже, поэтому минимизация количества запускаемых процессов имеет значение при работе в таких средах, как Cygwin.
Для таких простых случаев достаточно использовать инструмент awk (или sed ). Комбинация нескольких инструментов была бы чрезмерно сложной и часто избыточной:
echo -e "foo\nbar\nbaz" | awk 'NR==1{print $0" cats"}'
Результат:
foo cats
Какие факторы мне следует учитывать?
Убедитесь, что необходимая обработка текста требует комбинации нескольких различных инструментов, в противном случае - используйте возможности одного отдельного инструмента
Допустим, мне нужно добавить только определенное слово перед первым словом во входной строке - это также легко с помощью инструмента sed :
echo -e "foo\nbar\nbaz" | sed 's/^.*$/& cats/; 1q'
foo cats
echo -e
, e
флаг «включает интерпретацию экранирования обратной косой черты»
В любом случае, это зависит от того, насколько сложен ваш вводимый текст и насколько сложны ваши правила обработки текста