Как стать автором
Обновить

13 инструментов для обработки текста в командной оболочке

Время на прочтение17 мин
Количество просмотров86K
Всего голосов 56: ↑53 и ↓3+50
Комментарии65

Комментарии 65

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

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

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

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


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

НЛО прилетело и опубликовало эту надпись здесь

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


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

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

НЛО прилетело и опубликовало эту надпись здесь
можно было написать без cat

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

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


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

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

НЛО прилетело и опубликовало эту надпись здесь

Простите, но вы какую-то ерунду написали. В какой оболочке одновременное перенаправление двух файлов в 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> -exec <command> {} +

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

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

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

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

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

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

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

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

НЛО прилетело и опубликовало эту надпись здесь
Возможно. Или я с годом ошибся.

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

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


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

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

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

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


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

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


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

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

Тогда python

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

Нет

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

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

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

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий