Taglia dinamicamente la larghezza della linea stdout in Bash


9

Ultimamente, ho sperimentato il pscomando e a volte lunghi percorsi si avvolgono alla riga successiva (o due) e rendono difficile la lettura. Voglio convogliare l' psoutput in un altro programma per limitare l'output al xnumero di caratteri.

Ecco quello che ho finora, ma non funziona abbastanza bene:

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

$(stty size | cut -d' ' -f2)valuta 167, ma non sembra essere un input valido per cut.

C'è un modo per far funzionare questo tipo di sintassi in bash?


Questo lavoro per me. Potete fornire un output?
cuonglm,

dov'è la parte dinamica? Vuoi una lunghezza diversa per determinate condizioni? Sembra che tu voglia limitare tutto l'output a una lunghezza massima

@awk_FTW A seconda della situazione, ho diverse impostazioni della finestra. A schermo intero, la mia larghezza è 167. Ma ad altre dimensioni, dovrò essere più piccolo. Ecco perché voglio chiamare ssty per ottenere le dimensioni.
lenticchie

Provatput rmam; ps aux
Stéphane Chazelas,

Alcune conchiglie piace zsh, ksh93o bashconservare la larghezza del terminale in$COLUMNS
Stéphane Chazelas

Risposte:


5

Le seguenti opere:

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

Questo funziona anche:

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

Il problema sembra essere quello che sttydeve avere il tty sul suo input standard per funzionare. I due approcci di cui sopra lo risolvono.

C'è ancora un'altra opzione. Mentre sttystdin e stdout sono entrambi reindirizzati nei comandi precedenti, il suo stderr non lo è: indica ancora un terminale. Stranamente, sttyfunzionerà anche se gli viene dato lo stderr come input:

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

Anzi, lo fa! Questo era esattamente quello che stavo cercando. Solo curioso, perché hai aggiunto il tee alla fine?
lenticchie

@lentils Spiacenti, è teestato aggiunto durante il debug. Ora è andato.
Giovanni 1024,

A cosa si riferiscono <& 2? Non ho mai visto questa notazione prima.
lenticchie,

@lentils Nella shell, i file sono numerati. Lo zero si riferisce all'input standard, uno all'output standard e due all'errore standard. L'espressione <&2significa ottenere il tuo input dall'errore standard.
Giovanni 1024,

1
sttyottiene le impostazioni del terminale aperto sul suo stdin (ad esempio, stty < /dev/other-ttyper ottenere le impostazioni di un altro terminale). Quindi non è strano che non funzionerà se il suo stdin è un tubo o che <&2funziona.
Stéphane Chazelas,

8

Alcune conchiglie piace zsh, basho mkshimpostare automaticamente la $COLUMNSvariabile per la larghezza del terminale, quindi non c'è bisogno di invocare sttyqui.

Tutte le implementazioni di psHo provato che supportano quella sintassi non standard (tipo BSD) interrogano da soli la larghezza del terminale. Sono sorpreso che il tuo no. Mi aspetto che esaminerà il contenuto della variabile d' COLUMNS ambiente però.

Quindi potresti fare:

export COLUMNS; ps aux

Altrimenti,

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

Puoi anche dire al tuo terminale di non avvolgere le linee:

tput rmam
ps aux

4

Puoi anche gestire l' psoutput un po 'meglio.

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

ps -ww ${opts} #no word wrap

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

Questo dirà psdi analizzare il suo output secondo le tue specifiche, se necessario.

Naturalmente, se non si esegue la parola a capo automatico, tuttavia, si ha il problema di perdere informazioni. Ne hai davvero bisogno per tutti i processi? Aprilo in un cercapersone in tal caso:

ps ww ${opts} | $PAGER

In caso contrario, specifica cosa vuoi vedere:

ps -o args= -p $pid

In alternativa puoi informare esplicitamente psdel tuo terminale --width:

man ps

...

w Uscita ampia. Utilizzare questa opzione due volte per larghezza illimitata.

-w Uscita ampia. Utilizzare questa opzione due volte per larghezza illimitata.

--width n Imposta la larghezza dello schermo.

La --widthcosa funziona esattamente secondo le specifiche richieste senza la necessità di coinvolgere filtri aggiuntivi o processi ausiliari (che probabilmente ingombreranno l' -auxoutput ancora di più). E $COLUMNScome mostrato sopra e come sottolinea Stephane funzionerà anche in modo dinamico.

E 'probabilmente la pena di notare, però, che trovo le persone spesso cercano di aggiungere questi tipi di filtri non necessari in modo da poter ospitare una |pipeattraverso un altro filtro per l'uscita di analisi che è anche abbastanza probabile che sia inutile. Certo, per gente intendo principalmente me.

L' -ooperando utput che menziono sopra ti consente di filtrare quali colonne psvengono visualizzate e quando aggiungi l' =assegnazione puoi persino nominare la colonna come preferisci. Lascio l'attribuzione vuota e la mano un bersaglio -process $pidquindi l'unica uscita da psaffatto è il $pidnome del comando e sua argsalla chiamata. E -ograffia appena la superficie di come è possibile definire ciò psche verrà visualizzato o meno. Questa è la direzione che consiglierei di prendere, in particolare tramite:

man ps

... 

Per vedere ogni processo sul sistema usando la sintassi BSD:

ps ax

ps axu

Per stampare un albero di processo:

ps -ejH

ps axjf

Per ottenere informazioni sui thread:

ps -eLf

ps axms

Per ottenere informazioni sulla sicurezza:

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

ps axZ

ps -eM

Per vedere ogni processo in esecuzione come root (ID reale ed effettivo) nel formato utente:

ps -U root -u root u

Per vedere ogni processo con un formato definito dall'utente:

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

Stampa solo gli ID processo di syslogd:

ps -C syslogd -o pid=

Stampa solo il nome di PID 42:

ps -p 42 -o comm=

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.