Ricerca nel sito web

xargs per principianti con esempi


L'utilizzo di xargs, descritto nel manuale di Linux xargs come uno strumento che costruisce ed esegue righe di comando da input standard, può esercitare una notevole quantità di potenza aggiuntiva su qualsiasi altro comando eseguito sulla riga di comando di Bash. Fondamentalmente, xargs prenderà l'output da qualsiasi altro strumento e lo utilizzerà come input per ulteriori elaborazioni e azioni (da qui il riferimento all'esecuzione delle righe di comando nel manuale). Se queste sono le tue prime settimane o mesi con xargs, o hai appena iniziato, questo è il posto migliore per entrare in xargs.

In questo tutorial imparerai:

  • Come usare xargs dalla riga di comando in Bash
  • Come funziona xargs, cosa fa e come usarlo bene
  • Esempi di utilizzo di base con xargs dalla riga di comando in Bash

xargs per principianti con esempi

Requisiti software e convenzioni utilizzate

Esempio 1: Un inizio semplice

Entriamo subito nel vivo con un semplice esempio di xargs:

echo '1' > 1
echo '2' > 2
echo '3' > 3
ls
1  2  3
ls | xargs cat
1
2
3

In questo esempio, abbiamo creato rapidamente 3 file facendo eco a un numero e quindi reindirizzando l'output (utilizzando >) a 3 singoli file denominati da 1 a 3. Successivamente, abbiamo verificato l'esistenza dei file con il comando ls (elenca il contenuto della directory).

Nell'ultimo comando, abbiamo usato ls e piped (usando |) è l'output in xargs. Dopo il comando xargs abbiamo elencato il nuovo comando che volevamo che xargs eseguisse per ogni input ricevuto, individualmente per input, in questo caso cat (che emette il contenuto di un file).

Fondamentalmente il comando sopra è analogo con il seguente insieme di comandi (anche se se il contenuto della directory cambiasse, non sarebbe più analogo poiché xargs includerà semplicemente nuove voci di directory):

cat 1
1
cat 2
2
cat 3
3

Esempio 2: Un po' più complesso

ls --color=never | xargs -I{} cat {}
1
2
3

Qui abbiamo aggiunto alcuni modi di dire della sintassi Bash (un modo di dire è un costrutto/espressione del linguaggio) per migliorare notevolmente la qualità e forse la leggibilità dello stesso script di una riga, anche se l'output - in questo caso - è rimasto lo stesso.

L'opzione -I{} per xargs definisce una stringa di sostituzione che verrà utilizzata all'interno del comando xargs per inserire, nel punto in cui la stringa di sostituzione viene riutilizzata, l'input ricevuto, e quello per ogni input individualmente - cioè il comando specificato dopo il comando xargs verrà eseguito per ogni input individualmente.

L'aggiunta --color=never rende l'output generato dal comando ls (e quindi l'input del comando xargs) molto più sicuro.

Esempio 3: Output difettoso

Nell'ultimo esempio abbiamo introdotto --color=never come opzione consigliabile. Diamo un'occhiata a un esempio di come, senza questa opzione, possiamo incorrere in problemi:

L'output di ls è contaminato dopo l'uso di xargs, richiedendo l'uso dell'opzione –color=never per ls

mkdir 1 2 3
ls
1  2  3
ls | xargs ls
ls: cannot access ''

Output 🙂 interessante Cosa è successo qui?

Abbiamo prima creato tre directory, da 1 a 3, e successivamente ne abbiamo verificato la creazione. Si noti che l'output è blu scuro, per gentile concessione dei colori della shell Bash, che sono configurati per impostazione predefinita, ad esempio su Ubuntu.

Successivamente abbiamo preso l'output di ls e lo abbiamo passato a xargs che a sua volta lo ha passato a ls. Simile a 'echo 1 | ls' ci si aspetterebbe. Ma non ha funzionato! Invece, abbiamo ricevuto una serie di codici colore backr. Chiunque lo veda per la prima volta avrebbe difficoltà a ricollegarlo ai codici colore.

L'aggiunta di una semplice opzione --color=never ha sanificato l'output di ls come input più adatto per xargs, e l'output appare come previsto: per le directory da 1 a 3, come output del comando ls, elenca i contenuti (cioè simile a ls 1; ls 2; ls3).

Esempio 4: Analisi del testo con xargs e sed

echo -e '1\n2\n3' > test
cat test
1
2
3
ls
test
ls --color=never | xargs -I{} cat {} | sed 's|[2-3]|0|'
1
0
0
ls --color=never | xargs -I{} cat {} | sed 's|[2-3]|0|' | xargs -I{} grep {} $(ls)
1

Un esempio un po' più impegnativo, ma lo capirete presto.

Il primo comando ha semplicemente creato un file con tre righe ( crea una nuova riga e l'opzione -e per echo consente di utilizzare ). Successivamente, abbiamo emesso il contenuto del file utilizzando cat e abbiamo controllato quanti file erano presenti utilizzando ls (solo uno; il file di test che abbiamo creato).

Poi abbiamo il nostro succoso comando xargs, che, come sapete dagli esempi precedenti, prende l'elenco delle directory, lo invia a xargs e restituisce il contenuto di ogni file passato utilizzando cat. Poi abbiamo un piccolo comando sed che sostituisce i numeri 2 e 3 con 0. L'output è l'intero contenuto del file di test, ma con 2 e 3 modificati in 0 come indicato.

Infine, prendiamo lo stesso comando e lo passiamo a un altro xargs. Pensatela in questo modo; Visivamente (nella tua mente) vedi l'output 1, 0, 0 del comando precedente che viene reindirizzato (|) negli XARG finali senza la complessità precedente. Vedi come puoi creare comandi molto complessi gradualmente in questo modo? Questo mostra anche la potenza di xargs in poche parole, anche se è possibile fare molto di più.

Nel comando finale passiamo l'output 1, 0, 0 a grep, che cercherà il contenuto di $ (ls). $() avvia una subshell, esegue qualsiasi comando sia in essa contenuto e inserisce l'output di quel comando nel punto in cui la subshell è stata chiamata. In altre parole, stiamo eseguendo:

grep '1' ./test
grep '0' ./test
grep '0' ./test

E i risultati sono davvero quelli attesi; 1, poiché non c'erano zeri nel file per cominciare.

Conclusione

In questo articolo abbiamo esaminato le basi del comando xargs e alcuni esempi di come xargs può essere utilizzato, inclusa l'analisi del testo e la manipolazione dell'elenco delle directory. Il mio prossimo articolo riguarderà l'uso più avanzato di xargs, inclusi ulteriori esempi.

Divertiti con xargs e lasciaci un commento con le tue righe di comando o script xargs più interessanti!

Articoli correlati: