Come usare Pipes su Linux

Contenuti

Terminale Linux su un laptop

Usa le pipeline Linux per coreografare il modo in cui collaborano le utilità della riga di comando. Semplifica i processi complessi e aumenta la produttività sfruttando una raccolta di comandi indipendenti e trasformandoli in un team con un unico scopo. Ti mostriamo come.

I tubi sono ovunque

Le pipeline sono una delle funzionalità della riga di comando più utili disponibili nei sistemi operativi Linux e Unix.. I tubi sono usati in innumerevoli modi. Guarda qualsiasi articolo della riga di comando di Linux, su qualsiasi portale web, non solo nel nostro, e vedrai apparire i tubi la maggior parte del tempo. Ho controllato alcuni dei post su Linux di How-To Geek, e in tutte si usano i tubi, in un modo o nell'altro.

Le pipe Linux ti consentono di eseguire azioni che non sono supportate da Linux guscio. Ma poiché la filosofia di design di Linux è di avere molte piccole utilità che facciano il tuo funzione dedicata molto benee senza funzionalità inutili, il mantra "fai una cosa e falla bene", puoi collegare stringhe di comando insieme a pipe in modo che l'output di un comando diventi l'input di un altro. Ogni comando che entra porta il loro talento unico alla squadra, e presto scoprirai di aver assemblato una squadra vincente.

Un semplice esempio

Supponiamo di avere una directory piena di molti tipi diversi di file. Vogliamo sapere quanti file di un certo tipo ci sono in quella directory. Ci sono altre alternative per farlo, ma lo scopo di questo esercizio è introdurre i tubi, per questo lo faremo con le pipe.

Possiamo ottenere un elenco dei file facilmente usando ls:

ls

Per separare il tipo di file di interesse, noi useremo grep. Queremos hallar archivos que tengan la palabra “pagina” nel nome o nell'estensione del file.

Useremo il carattere speciale della shell “|“Per incanalare l'output di ls entro grep.

ls | grep "pagina"

grep stampa linee che corrisponde al tuo modello di ricerca. Quindi, Questo ci dà un elenco contenente solo i file “.pagina”.

Anche questo banale esempio mostra la funzionalità delle pipe. L'uscita di ls non è stato inviato alla finestra del terminale. È stato inviato a grep come dati per il grep comando di lavorare. L'output che vediamo proviene da grep, che è l'ultimo comando in questa stringa.

Espandere la nostra catena

Iniziamo ad estendere la nostra catena di comandi pipeline. Noi possiamo contare i file “.pagina” aggiungendo il wc comando. Useremo il -l (conteggio delle linee) opzione con wc. Nota che allo stesso tempo abbiamo aggiunto il -l (formato lungo) opzione per ls . Lo useremo a breve.

ls - | grep "pagina" | wc -l

grep non è più l'ultimo comando della catena, quindi non vediamo la sua uscita. L'uscita di grep si nutre di wc comando. L'output che vediamo nella finestra del terminale è wc. wc informa che c'è 69 File ".page" nella directory.

Diffondiamo di nuovo le cose. Prenderemo il wc comando fuori dalla riga di comando e sostituiscilo con awk. Ci sono nove colonne nell'output di ls con il -l opzione (formato lungo). noi useremo awk per colonne di stampa cinque, tre e nove. Queste sono le dimensioni, il proprietario e il nome del file.

ls -l | grep "pagina" | imbarazzante '{Stampa $5 " " $3 " " $9}'

Otteniamo un elenco di quelle colonne, per ciascuno dei file corrispondenti.

Ora passeremo quell'uscita attraverso il sort comando. Useremo il -n opzione (numerico) Lasciare sort sappi che la prima colonna dovrebbe essere trattati come numeri.

ls -l | grep "pagina" | imbarazzante '{Stampa $5 " " $3 " " $9}' | sort -n

L'output è ora ordinato per dimensione del file, con la nostra selezione personalizzata a tre colonne.

Aggiungi un altro comando

Concludiamo aggiungendo il tail comando. Ti diremo di elencare i ultime cinque linee di partenza soltanto.

ls -l | grep "pagina" | imbarazzante '{Stampa $5 " " $3 " " $9}' | sort -n | coda -5

Ciò significa che il nostro comando si traduce in qualcosa di simile “Mostrami i cinque file” .pagina “più grande in questa directory, ordinati per dimensione”. Da dopo, non c'è nessun comando per raggiungerlo, ma quando si usano i tubi, abbiamo creato il nostro. Potremmo aggiungere questo, o qualsiasi altro comando lungo, come alias o funzione di shell per salvare tutta la scrittura.

Ecco il risultato:

Potremmo invertire l'ordine delle taglie aggiungendo il -r opzione (inversione) a sort comando, e usando head invece di tail scegli le linee dalla parte superiore della presa.

Questa volta, i cinque file “.pagina” i più grandi sono elencati dal più alto al più basso:

Alcuni esempi recenti

Ecco due esempi interessanti dai recenti post di How-To geek.

Alcuni comandi, Come la xargscomando, sono progettati hanno l'input canalizzato a loro. Ecco un modo che possiamo avere wc contare le parole, caratteri e linee in più file, canalizzazione ls entro xargs che successivamente alimenta l'elenco dei nomi dei file a wc come se fossero stati passati a wc come parametri della riga di comando.

ls *.pagina | xargs wc

Il numero totale di parole, i caratteri e le linee sono elencati nella parte inferiore della finestra del terminale.

Questo è un modo per ottenere un elenco ordinato delle estensioni di file univoche nella directory corrente, con un conteggio di ogni tipo.

ls | rev | taglia -d'.' -f1 | rev | ordinare | uniq -c

Qui stanno succedendo molte cose.

L'output mostra l'elenco delle estensioni di file, in ordine alfabetico con un conteggio di ogni tipo unico.

Tubi con nome

C'è un altro tipo di tubo a nostra disposizione, chiamato pipe con nome. Le pipe negli esempi precedenti vengono create al volo attraverso la shell durante l'elaborazione della riga di comando. I tubi sono creati, usato e poi scartato. Sono passeggeri e non lasciano traccia di se stessi. Esistono solo mentre il comando che li utilizza è in esecuzione.

Le pipe con nome appaiono come oggetti persistenti nel file system, così puoi vederli usando ls. Sono persistenti perché sopravviveranno al riavvio del computer, anche se tutti i dati non letti che contengono in quel momento verranno scartati.

Le pipe con nome sono state utilizzate molto contemporaneamente per consentire a diversi processi di inviare e ricevere dati, ma non li vedevo usati in quel modo da molto tempo. Indubbiamente, ci sono persone che li usano ancora con ottimi risultati, ma non ne ho trovati di recente. Ma per motivi di integrità, o semplicemente per soddisfare la tua curiosità, ecco come puoi usarli.

Le pipe con nome vengono create con il mkfifo comando. Questo comando creerà una pipe con nome chiamato “geek-pipa” La virgoletta singola o l'apostrofo della parola.

mkfifo geek-pipe

Possiamo vedere i dettagli della named pipe se usiamo il ls comando con il -l (formato lungo) opzione:

ls -l geek-pipe

Il primo carattere dell'elenco è un “P”, il che significa che è una pipa. Se fosse un “D”, significherebbe che l'oggetto filesystem è una directory, e uno script “-” significherebbe che si tratta di un file normale.

Usa pipe con nome

Usiamo la nostra pipa. Le pipe senza nome che abbiamo usato nei nostri esempi precedenti hanno passato i dati immediatamente dal comando di invio al comando di ricezione. I dati inviati tramite una pipeline denominata rimarranno nella pipeline fino a quando non verranno letti. I dati sono veramente archiviati in memoria, quindi la dimensione della pipe denominata non varierà in ls elencato se ci sono dati in esso o no.

Useremo due finestre di terminale per questo esempio. userò il tag:

# Terminale 1

in una finestra di terminale e

# Terminale 2

nell'altro, così puoi differenziarli. L'hashish “#” indica alla shell che ciò che segue è un commento e lo ignora.

Prendiamo l'intero nostro esempio precedente e reindirizziamolo alla pipe denominata. Quindi stiamo usando pipe con nome e senza nome in un comando:

ls | rev | taglia -d'.' -f1 | rev | ordinare | uniq -c > geek-pipa

Non sembrerà che succeda molto. Comunque, potresti notare che non torna al prompt dei comandi, quindi sta succedendo qualcosa.

Nell'altra finestra del terminale, dai questo comando:

gatto < geek-pipa

Stiamo reindirizzando il contenuto della pipe denominata a cat, Ecco perchè cat mostrerà quel contenuto nella seconda finestra del terminale. Ecco il risultato:

E vedrai che sei tornato al prompt dei comandi nella prima finestra del terminale.

Quindi, cos'è successo?

  • Reindirizzeremo alcuni risultati alla pipe denominata.
  • La prima finestra del terminale non è tornata al prompt dei comandi.
  • I dati sono rimasti nella pipeline fino a quando non sono stati letti dalla pipeline al secondo terminale.
  • Torniamo al prompt dei comandi nella prima finestra del terminale.

Potresti pensare di poter eseguire il comando nella prima finestra del terminale come attività in background aggiungendo a & fino alla fine del comando. E avresti ragione. Quindi, saremmo tornati immediatamente al prompt dei comandi.

Il punto di no L'uso dell'elaborazione in background era per evidenziare che una pipe con nome è a procedura di blocco. Mettere qualcosa in una pipe con nome apre solo un'estremità della pipe. L'altra estremità non si apre finché il lettore non estrae i dati. Il kernel sospende la procedura nella prima finestra del terminale fino a quando i dati non vengono letti dall'altra estremità della pipe.

Il potere dei tubi

Attualmente, Le pipe con nome sono una specie di atto dirompente.

Le vecchie pipe di Linux, d'altra parte, sono uno degli strumenti più utili che puoi avere nel toolkit della finestra del terminale. La riga di comando di Linux inizia a prendere vita per te, E ottieni un potenziamento completamente nuovo quando puoi orchestrare una raccolta di comandi per produrre una performance coerente..

Suggerimento d'addio: è meglio scrivere i comandi in pipeline aggiungendo un comando allo stesso tempo e facendo funzionare quella parte, in seguito canalizzando nel seguente comando.

impostaTimeout(funzione(){
!funzione(F,B,e,v,n,T,S)
{Se(f.fbq)Restituzione;n=f.fbq=funzione(){n.callMethod?
n.callMethod.apply(n,argomenti):n.queue.push(argomenti)};
Se(!f._fbq)f._fbq = n;n.push=n;n.loaded=!0;n.version='2.0′;
n.coda=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(T,S) } (window, documento,'copione',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('dentro', '335401813750447');
fbq('traccia', 'Visualizzazione della pagina');
},3000);

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.