Come usare `cat` o` less` a seconda del conteggio delle righe?


12

Quando guardo il contenuto dei file, vorrei catabbreviare automaticamente i file ma lessquelli che superano le dimensioni dello schermo. Potrei usare qualcosa con wc -l, ma c'è un modo migliore che forse considera anche la dimensione della finestra / la quantità attuale di linee disponibili?


1
Mentre molti strumenti fanno questo, nota che rompe l'aspettabilità. Cioè l'utente non può sapere in anticipo cosa accadrà. Trovo questo fastidioso, ad esempio, in git logcui fa esattamente questa cosa. Non sai mai in anticipo cosa otterrai (devi colpire q?).
maschera di bit

4
NOTA: in generale è consigliabile evitare di utilizzare catper visualizzare i file. In genere è necessario utilizzare solo catper inviare il contenuto di un file a stdout in modo che possa essere reindirizzato a un altro processo. Il motivo per evitare di usarlo catper la visualizzazione è che invia i byte non elaborati al terminale, il che può causare l'esecuzione di comandi imprevisti del terminale (ad esempio, alcuni utenti si sono bloccati quando un file conteneva i byte giusti per disabilitare la tastiera del terminale) . Di solito dovresti usare un cercapersone lesso un editor, che formatterà caratteri speciali per la visualizzazione in modo che non vengano interpretati dal terminale.
Chris Page

2
Se hai intenzione di utilizzare cat per visualizzare i contenuti dei file direttamente nel terminale, utilizza almeno in cat -vmodo da evitare caratteri speciali.
Chris Page

@bitmask buon punto, è per questo che ho chiesto Is split-screen cating possibile? che potrebbe essere una soluzione migliore
Tobias Kienzler,

@ChrisPage La mia tastiera non è stata uccisa, ma penso di essere riuscito a rovinare la tabella codici una volta ... Grazie per averlo cat -vsottolineato
Tobias Kienzler,

Risposte:


9

Per darti la formula che prevede il wccontrollo basato su:

(($(wc -l<input_file)<=$(tput lines))) && echo 'will fit' || echo 'not enough'

Esiste una $LINESvariabile shell che può anche essere usata:

(($(wc -l<input_file)<=LINES)) && echo 'will fit' || echo 'not enough'

Ma $LINESviene aggiornato solo quando al prompt dei comandi. Per capire cosa intendo, esegui questo e ridimensiona la finestra del terminale durante sleep:

( sleep 3; echo $LINES; tput lines )

Grazie, questo ha il vantaggio che può essere sintonizzato per l'uso lessgià se ad esempio sono stati utilizzati 2/3 dello schermo cat.
Tobias Kienzler,

20

Forse 'less -F file_to_read' è l'opzione: esce di meno se la finestra è sufficiente per visualizzare tutto il file e aspetta il cercapersone se non è così


suona bene, ma in questo caso non viene emesso nulla e i codici di uscita sono gli stessi in entrambi i casi
Tobias Kienzler,

Ho solo provato 'less -F / etc / passwd' e visualizza correttamente il file (con o senza cercapersone). Hai ragione, il codice di ritorno è 0 in entrambi i casi.
Dom

11
Tale comando funziona come richiesto, ma con un piccolo problema tecnico: cancella lo schermo dopo aver visualizzato il file. L'aggiunta -Xdell'opzione interromperà la cancellazione, quindi i file brevi verranno visualizzati allo stesso catmodo. Sfortunatamente con -Xlo schermo non verrà cancellato né dopo aver visualizzato file scorrevoli lunghi.
arte

1
@manatwork è fantastico, grazie. Non cancellare lo schermo è in realtà ok, dato che è quello che sarebbe (non) accadrebbe anche se catsi chiamasse
Tobias Kienzler il
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.