Pull to refresh

Comments 63

Главная фишка `tr` не раскрыта; все выше приведенные примеры с `tr` заменяются утилитой `sed «s///»`

Болезнь миллениалов: злоупотребление лишним cat:
cat multiline | awk .... вместо awk ... < multiline


Ну и надо бы знать хотя бы самые основы awk. Например, комбинировать его с grep чаще всего не нужно:
awk /needle/ { print "$12" }


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

а зачем в команде awk ... < multiline перенаправление,
когда вполне себе работает awk ... multiline?

Болезнь миллениалов: злоупотребление лишним cat:
cat multiline | awk… вместо awk… < multiline

Объясню — стремновато выглядит.
Примерно как "> myfile": был myfile — и нет myfile.
Поэтому конструкция "awk… < multiline" выглядит так, как будто сейчас "..." будет прибито.
Нет, ну правда.


А так — цивильный конвейер, слева направо, всё нормуль.
Можно дальше что-нить прицепить без заморочек.

Мне почему-то не кажется. К тому же, в сети можно увидеть и другие примеры, например, cat /var/log/nginx.log | grep Firefox, потому что дурная привычка въедается в пальцы. А новички, например, читают 10-20 подобных статей, и им потом даже в голову не приходит, что правильно (или вообще возможно) писать иначе.

Оукей.
Покажите в правильном виде (с "<"):


sudo cat /var/log/messages | grep systemd | gawk '{print $6}' | less

Только так, чтобы живому человеку было понятно кто кому Рабинович.
В данном случае — источник | команда | команда | ...

Исключение можно найти для любого правила. Большинство примеров, в т.ч. в этой статье, можно было написать без cat без потери читаемости.


К тому же, здесь опять же зачем-то awk комбинируется с grep — можно было сразу написать gawk '/systemd/ { print $6 }'.

можно было написать без cat

Можно. Пишите без cat, никто ж не запрещает.
Вам кота жалко, что ли? )

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


cat ... | grep ...
cat ... | awk ...
cat ... | wc
cat ... | cat ...
wtf ... | cat ...

С другой стороны, это всё борьба тупоконечников с остроконечниками. Главное — результат.

не умеет несколько файлов (cat используется для конкатенации)

Для нескольких файлов можно использовать такую конструкцию:


command < file1 < file2

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

Простите, но вы какую-то ерунду написали. В какой оболочке одновременное перенаправление двух файлов в stdin приведёт к их конкатенации?


######## bash
$ cat 1.txt
1content
$ cat 2.txt
2content
$ cat 1.txt 2.txt
1content
2content
$ cat < 1.txt
1content
$ cat < 2.txt
2content
$ cat < 1.txt < 2.txt
2content

Да, вы правы, моя ошибка. Где-то видел подобную конструкцию, но видимо неправлильно ее понял.

В какой оболочке одновременное перенаправление двух файлов в stdin приведёт к их конкатенации?

В zsh с включенным multios.

Как выглядит исключение из правила "всегда используй cat и пайпай потом его во что нужно для задачи"?

sudo grep systemd /var/log/messages | gawk '{print $6}' | less

Я терпеть не могу перенаправления, но многое работает и вот так.

Захочется искать не только в messages, но messages.1.gz — тут cat и пригодится.
sudo ( zcat messages.1.gz | cat messages -) | grep ...


А в чем проблема с useless cat? Экономия 2 символов? ;)

Когда надо — тогда надо. Но когда это часть большого скрипта плодить процессы может быть неидеальной идеей.

Цимус использования cat в этом случае для меня, что я оперативно могу поправить, что я именно делаю с nginx.log — могу быстро, вызвав предыдущую команду, заменить Firefox на Chrome или grep Firefox на cat -d -f 3, а также могу оперативно переключиться в начало строки и заменить cat на tail -n 100.

Вывод адреса IPv4, связанного с сетевым интерфейсом:
ip ad |awk '/inet / {print $2}'
ifconfig — это уже несколько устарело (мало того! встречался с ситуациями, когда ip ad показывал интерфейс/адрсес, а ifconfig — нет, а вот обратного не видел. Но утверждать, что обратного быть не может, я не буду);
/inet / — шаблон строки, которая должна быть обработана, сразу отсекает inet6, т.к. после 't' идёт пробел.

ip добавляет IP на тот же интерфейс, а ipconfig на сабинтерфейс :0. По этому и не видно.

Тема xargs вообще не раскрыта. А между тем:
find <path> -print0|xargs -0 -I {} <command> {}
это наиболее простой способ обработать файлы, в именах которых есть пробелы.

Тема find тоже не раскрыта, но заголовок поста — "… для обработки текста".

Ну расскажите уже, как без find обработать текстовые файлы с пробелами и прочими непотребствами в наименованиях. Я вот сколько не пытался, либо ничего не получается, либо какие-то совершенно монструозные конструкции.

Не очень понятно при чем find к пробелам в имени файла.
Речь о том, что человек обрисовал только примочки для работы с текстом.
Не с файлами как таковыми.
Поэтому нет xargs, find, tee и прочих извращений инструментов.
Иначе проще было бы написать перевод info.


PS. файлы с пробелами в именах обрабатываются как-то так:


ls -1 | while read -r; do echo "$REPLY"; done

ls | while пишут джуны. Сеньоры пишут, как товарищ выше написал.

Тимлиды пишут "Сеньору: вывести список файлов".


Это принципиально кто как пишет?
Главное — результат, в приемлемые сроки и в сопровождаемом виде.

Но вот это не будет работать если в названии файла есть перенос строки же.

Это принципиально кто как пишет?

Нет, просто сеньоры уже успели набить шишек в таких конструкциях.

Утилитами командной строки, включая xargs, можно делать всякие извращения… Например выводит количество дней в каждом месяце текущего года (или любого, если чуть поправить) Люблю всякие дурацкие задачи на SO.
seq 12|xargs -i sh -c 'LC_ALL=C cal 31 {} $(date +%Y) 2>&1|grep -Eo "\-(2[8|9])|\-30|31"|cut -d "-" -f 2|tr "\n" " "'

А вот более жизненная, хоть не сильно быстрая, но на безрыбье и ping nmap. ;-)
 seq 1 254|xargs -i sh -c 'ping -c1 -W1 172.19.76.{} >&/dev/null && echo 172.19.76.{} is up'

Конкретно в данном случае можно написать проще:
find <path> -print0|xargs -0 <command>


Кстати, у xargs много применений. Например, в Linux посмотреть полную командную строку, использовавшуюся для запуска процесса:


$ xargs -0 echo < /proc/1083/cmdline                                                                                                                            
containerd --config /var/run/docker/containerd/containerd.toml --log-level info

Конкретно в данном случае можно написать еще проще:
find <path> -exec <command> {} +

$ xargs -0 echo < /proc/1083/cmdline

и чем это лучше чем просто
cat /proc/1083/cmdline

намного короче получается

Тем, что просто cat /proc/1083/cmdline выведет нечитаемую или трудно читаемую строку, в зависимости от терминала.

Нужно найти способ переименовать bool_from_str повсюду в нашем проекте. Такого можно добиться с помощью команд grep, sed, а также циклов for или с помощью xargs.

И того, кто предложил такую идею — четвертовать, показательно.

Интересно, кто поставил минус? Я обеими руками за grep, sed, xargs, но не для рефакторинга исходников. Поверьте, в реальной кодовой базе такие массовые переименования инструментами, которые не понимают код, привнесут массу больших и маленьких ошибок. И
это не теоретизирование, а знание, основанное на опыте.


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


Такие переименования можно делать только лишь в редакторе, в интерактивном режиме, проверяя каждую замену, либо специальным инструментом для рефакторинга, понимающим синтаксис языка.

либо специальным инструментом для рефакторинга, понимающим синтаксис языка

Который обязательно поломается на аспектах, рефлекшене, метапрограммировании и (прости хоспади) эвалах. Ну уж нет, рефакторинг с помощью инструментов — это такая же не работающая лажа, как и grep вслепую в данном случае.

Хз кто минусанул, я вот соглашусь — нефиг консольными тулзами лезть в код.

В общем случае — да, в частных — вполне. Если рефакторинга немного, ничего лучше sed+awk, за которыми сразу следует git diff — человечество не придумало.

Если немного, какой смысл вылезать из уютненькой идешечки? Вот если она не осиливает, то да, но это уже будет значить, что кода — не одна сотня мегабайт, и страшно будет в любом случае, чем ни полезь…
какой смысл вылезать из уютненькой идешечки? Вот если она не осиливает
Или если она не существует.
Если мы берём не язык из топ-20, такое вполне частое явление. Даже у JS до ~2010 не было иде. А sed/awk тащат любой текстовый язык.

После появления Language Server протокола с кошерными реализациями, я вообще не понимаю, кому нахрен может прийти в голову в нее вообще влезать.

Справедливости ради, в 2009-м году IntelliJ очень хорошо понимала JS, на голову выше любой другой IDE или редактора.


Возможно, и до 2009 года тоже — просто в 2009-м году впервые столкнулся с разработкой большого проекта на JS.


Как раз по тем временам помню, что работа с JS любыми другими средствами была слишком тяжелой, так как язык очень динамичный. И простыми текстовыми инструментами работать с большой кодовой базой было очень неудобно.

Возможно. Или я с годом ошибся.

Впрочем, уточню мысль: для ещё-вчера-noname языков нет ide, ибо жирно (дай бог чтоб кроме компилятора вообще что-то было), но жизнь заставляет с ними работать и рефакторить.
жизнь заставляет с ними работать и рефакторить

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


Профессионалам IDE только мешает своими свистелками и постоянным мерцанием то тут, то там.

Особенно когда оно еще ежедневно предлагает что-то обновить. После чего что то надо подправить иначе не собирается.

Профессионалы обычно могут настроить IDE так, чтобы только нужные им свистелки и мерцания были.

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


Syntax highlighting — единственная причина, почему меня не устраивает Notepad.

А чем вы пользуетесь, что оно вас из коробки не отвлекает?


У меня есть опыт как с редакторами (Vim, Emacs, VS Code), так и с IDE (VS, PHPStorm) — допиливать приходилось и те, и другие.

В этом сезоне модно Go, Node.js, .Net (то есть .NET, прошу прощения).
Многопоточно, асинхронно и с элементами ИИ.
Perl уже моветон.

Сколько лет ими пользуюсь, но без гугла/мана максимум простой grep могу написать и то с дефолтнымитрегэкспами, которых не знаю. У всех так?

У меня так же. К тому же баш-скрипты с обилием подобного объективно нечитаемые и перегруженные.
Тот же скрипт на руби будет понятным и через год, к тому же чаще всего будет значительно короче.
Более того, он даже понятнее для коллег, которые язык не знают, чем разгадывание ребусов из подобных утилит.

Не увидел (ситуационно) полезного nl — нумерация строк. У sort есть еще полезный ключик -k для сортировки не с начала строки, а по заданному «полю». А еще есть ключик -u, чтобы сразу оставлять только уникальные (из соседних, как uniq). В свое время, не зная об uniq -c, использовал цепочку sort | nl | sort -k2 -u + немного арифметики.

А еще существуют rev и tac, с которыми тоже можно насочинять много интересных дел.
fold не умеет в юникод
использую вмето него par, очень гибкий инструмент
Я бы в список еще column добавил — позволяет отображать данные в виде таблицы, берет на себя всю работу по выравниванию. Получается весьма наглядно и информативно, вот например:
Заголовок спойлера
image

Причем применение предельно простое, что то вроде такого:
echo "$TableRows" | column -t

Единственный недостаток — column не умеет адекватно обрабатывать коды управления цветом, текст уезжает. Приходится выбирать между выравниванием и цветным выводом.
Заголовок спойлера
Ура! Мой первый одобренный комментарий за 8 лет!

grep 'editor =' ~/.gitconfig | cut -d'=' -f2 | sed 's/ //'
grep -oP "(?<=editor\s=\s)(.*)" ~/.gitconfig
возможен пробел в конце строки, или
awk '/editor =/ {print $3}' ~/.gitconfig
Only those users with full accounts are able to leave comments. Log in, please.

Information

Founded
Location
Россия
Website
www.itsumma.ru
Employees
101–200 employees
Registered