Pull to refresh

Comments 65

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

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

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

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


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

UFO just landed and posted this here

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


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

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

UFO just landed and posted this here
можно было написать без cat

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

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


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

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

UFO just landed and posted this here

Простите, но вы какую-то ерунду написали. В какой оболочке одновременное перенаправление двух файлов в 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
UFO just landed and posted this here
В какой оболочке одновременное перенаправление двух файлов в 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'
UFO just landed and posted this here

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

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

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

намного короче получается
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
либо специальным инструментом для рефакторинга, понимающим синтаксис языка

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

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

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

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

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

UFO just landed and posted this here
Возможно. Или я с годом ошибся.

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

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


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

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

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

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


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

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


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

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

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

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

А еще существуют rev и tac, с которыми тоже можно насочинять много интересных дел.
А кстати sort -u это же самое, что и sort | uniq
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

Круть крутейшая! Спасибо, оч познавательно, добавил в закладки!

Спасибо, рады, что принесли вам пользу!)

Sign up to leave a comment.