Recorte dinámicamente el ancho de línea estándar en Bash

9

Últimamente, he estado experimentando con el pscomando y, a veces, los caminos largos se envuelven a la siguiente línea (o dos) y dificultan la lectura. Quiero canalizar la pssalida a otro programa para limitar la salida al xnúmero de caracteres.

Esto es lo que tengo hasta ahora, pero no funciona del todo bien:

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

$(stty size | cut -d' ' -f2)evalúa a 167, pero no parece ser una entrada válida para cut.

¿Hay alguna manera de hacer que este tipo de sintaxis funcione en bash?

lentejas
fuente
Este trabajo para mi. ¿Puedes proporcionar alguna salida?
Cuonglm
¿Dónde está la parte dinámica? ¿Quieres una longitud diferente para ciertas condiciones? Parece que desea limitar toda la salida a una longitud máxima
@awk_FTW Dependiendo de la situación, tengo diferentes configuraciones de ventana. En pantalla completa, mi ancho es 167. Pero en otros tamaños, tendré que ser más pequeño. Es por eso que quiero llamar a ssty para obtener el tamaño.
lentejas
Pruebatput rmam; ps aux
Stéphane Chazelas
Algunas conchas gusta zsh, ksh93o bashalmacenan el ancho de la terminal en$COLUMNS
Stéphane Chazelas

Respuestas:

5

Los siguientes trabajos:

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

Esto también funciona:

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

El problema parece ser que sttynecesita tener el tty en su entrada estándar para funcionar. Los dos enfoques anteriores resuelven eso.

Todavía hay otra opción. Mientras que sttystdin y stdout se redirigen en los comandos anteriores, su stderr no lo es: todavía apunta a una terminal. Curiosamente, sttytambién funcionará si se le da stderr como entrada:

ps aux | cut -c1-$(stty size <&2 | cut -d' ' -f2)
John1024
fuente
De hecho, lo hace! Esto era exactamente lo que estaba buscando. Por curiosidad, ¿por qué agregaste el tee tt al final?
lentejas
@lentils Vaya, teese agregó cuando estaba depurando. Se ha ido ahora.
John1024
¿A qué se refiere <& 2? Nunca he visto esa notación antes.
lentejas
@lentils En el shell, los archivos están numerados. Cero se refiere a entrada estándar, uno a salida estándar y dos a error estándar. La expresión <&2significa obtener su entrada del error estándar.
John1024
1
sttyobtiene la configuración del terminal abierta en su stdin ( stty < /dev/other-ttypor ejemplo , para obtener la configuración de otro terminal). Por lo tanto, no es extraño que no funcione si su stdin es una tubería o eso <&2funciona.
Stéphane Chazelas
8

A algunos shells les gusta zsh, basho mkshconfiguran automáticamente la $COLUMNSvariable al ancho del terminal, por lo que no necesita invocar sttyaquí.

Todas las implementaciones de psTraté de soportar esa sintaxis no estándar (tipo BSD) consultan el ancho del terminal por sí mismas. Me sorprende que el tuyo no. Sin embargo, espero que vea el contenido de la variable de COLUMNS entorno .

Entonces podrías hacer:

export COLUMNS; ps aux

Si no,

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

También puede decirle a su terminal que no ajuste las líneas:

tput rmam
ps aux
Stéphane Chazelas
fuente
4

También puede manejar la pssalida un poco mejor.

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

ps -ww ${opts} #no word wrap

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

Eso le indicará psque analice su salida según sus especificaciones según sea necesario.

Por supuesto, si no ajusta la palabra, entonces tiene el problema de la falta de información. ¿Realmente lo necesitas todo para todos los procesos? Ábralo en un buscapersonas si es así:

ps ww ${opts} | $PAGER

Si no, especifique lo que desea ver:

ps -o args= -p $pid

Alternativamente, puede informar explícitamente psde su terminal --width:

man ps

...

w Amplia salida. Use esta opción dos veces para un ancho ilimitado.

-w Amplia salida. Use esta opción dos veces para un ancho ilimitado.

--width n Establecer ancho de pantalla.

La --widthcosa funciona exactamente según sus especificaciones solicitadas sin tener que involucrar filtros adicionales o procesos auxiliares (lo que probablemente solo saturará su -auxsalida aún más). Y con lo $COLUMNSque se muestra arriba y como señala Stephane, incluso funcionará dinámicamente.

Sin embargo, probablemente valga la pena señalar que encuentro que las personas a menudo intentan agregar este tipo de filtros innecesarios para que puedan acomodar uno a |pipetravés de otro filtro para analizar la salida, que también es bastante probable que sea innecesario. Por supuesto, por personas me refiero principalmente a mí.

El -ooperando utput que menciono anteriormente le permite filtrar qué columnas se psmuestran, y cuando agrega la =asignación, incluso puede nombrar la columna como desee. Dejo la asignación vacía y le doy un -pproceso de destino $pidpara que la única salida de pstodos sea el $pidnombre del comando y su argsinvocación. Y -oapenas rasca la superficie de cómo puedes definir lo que se psmostrará o no. Esta es la dirección que le recomendaría que tome, especialmente a través de:

man ps

... 

Para ver todos los procesos en el sistema utilizando la sintaxis BSD:

ps ax

ps axu

Para imprimir un árbol de procesos:

ps -ejH

ps axjf

Para obtener información sobre hilos:

ps -eLf

ps axms

Para obtener información de seguridad:

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

ps axZ

ps -eM

Para ver todos los procesos que se ejecutan como root (ID real y efectiva) en formato de usuario:

ps -U root -u root u

Para ver todos los procesos con un formato definido por el usuario:

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

Imprima solo los ID de proceso de syslogd:

ps -C syslogd -o pid=

Imprima solo el nombre de PID 42:

ps -p 42 -o comm=

mikeserv
fuente