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!