Динамично обрежьте stdout ширину строки в Bash

ZFS, порожденный в Солярисе в 2004 и теперь доступный в нескольких Нельдах включая FreeBSD и Linux (хотя на Linux все еще в бета-версии а не в ядре магистрали из-за лицензирования проблем) также, позволяет добавлять один или несколько вторичных названных кэшей L2ARC на любом блочном устройстве для того же самого вида цели.

9
18.04.2014, 08:39
3 ответа

Работает следующее:

ps aux | cut -c1-$(stty size </dev/tty | cut -d' ' -f2)

Это тоже работает:

v=$(stty size | cut -d' ' -f2) ; ps aux | cut -c1-$v

Проблема, похоже, в том, что stty должен иметь tty на стандартном входе, чтобы функционировать. Приведенные выше два подхода решают эту проблему.

Есть еще один вариант. В то время как stdin и stdout stty перенаправляются в приведенных выше командах, stderr не перенаправляется: он по-прежнему указывает на терминал. Как ни странно, stty также будет работать, если ему в качестве входных данных указать stderr:

ps aux | cut -c1-$(stty size <&2 | cut -d' ' -f2)
5
27.01.2020, 20:05

Вы также можете немного улучшить вывод ps .

ps --width ${n:-$COLUMNS} ${opts} #set ps terminal width

ps -ww ${opts} #no word wrap

ps -o ${only_interesting_output} ${opts} #trim output

Это сообщит ps о необходимости синтаксического анализа вывода в соответствии с вашими требованиями.

Конечно, если вы не используете перенос слов, у вас проблема с отсутствием информации. Вам действительно нужно все это для всех процессов? Если да, откройте его в пейджере:

ps ww ${opts} | $PAGER

Если нет, укажите, что вы хотите видеть:

ps -o args= -p $pid

В качестве альтернативы вы можете явно сообщить ps вашего терминала - width :

man ps

...

w Широкий выход. Используйте эту опцию дважды для неограниченной ширины.

-w Широкий выход. Используйте эту опцию дважды для неограниченной ширины.

- ширина n Установить ширину экрана.

Параметр - width работает в точном соответствии с вашими запрошенными спецификациями без необходимости использования каких-либо дополнительных фильтров или вспомогательных процессов (которые, вероятно, только загромождают ваш -aux вывод даже более). А с $ COLUMNS , как показано выше и как указывает Стефан, он будет даже работать динамически.

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

Операнд -o utput, о котором я упоминал выше, позволяет фильтровать, какие столбцы отображаются в ps , а при добавлении задания = вы даже можете назвать столбец как вам будет угодно. Я оставляю назначение пустым и передаю ему target -p rocess $ pid , поэтому единственный вывод из ps вообще - это $ pid имя команды и ее аргументы при вызове. А -o едва ли поверхностно определяет, что ps будет отображать, а что нет.Это направление, которое я бы порекомендовал вам выбрать, особенно через:

man ps

... 

Чтобы увидеть каждый процесс в системе с использованием синтаксиса BSD:

ps ax

ps axu

Чтобы распечатать дерево процессов:

ps -ejH

ps axjf

Чтобы получить информацию о потоках:

ps -eLf

ps axms

Чтобы получить информацию о безопасности:

ps -eo euser, ruser, suser, fuser, f , comm, label

ps axZ

ps -eM

Чтобы увидеть каждый процесс, запущенный как root (реальный и эффективный ID) в пользовательском формате:

ps -U root -u root u

To просмотр каждого процесса в пользовательском формате:

ps -eo pid, tid, class, rtprio, ni, pri, psr, pcpu, stat, wchan: 14, comm

ps axo stat, euid, ruid, tty, tpgid, sess, pgrp, ppid, pid, pcpu, comm

ps -Ao pid, tt, user, fname, tmout, f, wchan

Распечатать только идентификаторы процессов syslogd:

ps - C syslogd -o pid =

Вывести только имя PID 42:

ps -p 42 -o comm =

4
27.01.2020, 20:05

Некоторые оболочки, такие как zsh, bash или mksh автоматически устанавливают переменную $COLUMNS в ширину терминала, поэтому здесь не нужно вызывать stty.

Все реализации ps, которые я пробовал, поддерживающие этот нестандартный (BSD-типа) синтаксис, сами запрашивают ширину терминала. Я удивлен, что ваша не делает этого. Я ожидаю, что он будет смотреть на содержимое COLUMNS переменной окружения.

Так что вы можете сделать:

export COLUMNS; ps aux

Если нет,

ps aux | cut -c"1-$COLUMNS"

Вы также можете сказать своему терминалу не заворачивать строки:

tput rmam
ps aux
8
27.01.2020, 20:05

Теги

Похожие вопросы