Как создавать и выполнять команды из стандартного ввода в Linux (Xargs)

12 set 2022 3 min di lettura
Как создавать и выполнять команды из стандартного ввода в Linux (Xargs)
Indice dei contenuti

Введение

Утилита xargs позволяет создавать и выполнять команды из стандартного ввода.

xargs обычно используется в сочетании с другими передаваемыми по конвейеру командами. С помощью xargs вы можете предоставлять стандартный ввод в качестве аргументов утилитам командной строки, таким как mkdir и rm.

В этом уроке мы рассмотрим основы использования команды xargs.

Как использовать команду Xargs

xargs читает аргументы из стандартного ввода, разделенные пробелом или новой строкой, и выполняет указанную команду, используя ввод в качестве аргументов команды. Если команда не указана, по умолчанию используется /bin/echo.

Синтаксис команды xargs следующий:

xargs [OPTIONS] [COMMAND [initial-arguments]]

Самым простым примером использования команды xargs может быть передача нескольких строк, разделенных пробелами, с использованием конвейера и запуск команды, которая будет использовать эти строки в качестве аргументов.

echo "file1 file2 file3" | xargs touch

В приведенном выше примере мы передаем стандартный ввод в xargs и команда touch выполняется для каждого аргумента, создавая три файла. Это то же самое, как если бы вы запустили:

touch file1 file2 file3

Показать команду

Чтобы вывести команду на терминал перед ее запуском, используйте параметр -t ( --verbose ):

echo "file1 file2 file3" | xargs -t touch
touch file1 file2 file3

Если вы хотите получить подсказку о том, следует ли запускать каждую команду перед ее запуском, используйте параметр -p ( --interactive ):

echo "file1 file2 file3" | xargs -p touch

Введите y или Y, чтобы подтвердить и выполнить команду:

touch file1 file2 file3 ?...y

Эта опция полезна при выполнении деструктивных команд.

Как ограничить количество аргументов

По умолчанию количество аргументов, передаваемых команде, определяется системным ограничением.

Опция -n ( --max-args ) указывает количество аргументов, которые необходимо передать данной команде. xargs будет выполнять указанную команду столько раз, сколько необходимо, пока не будут исчерпаны все аргументы.

В следующем примере количество аргументов, считываемых со стандартного ввода, ограничено 1.

echo "file1 file2 file3" | xargs -n 1 -t touch

Как видно из приведенного ниже подробного вывода, команда touch выполняется отдельно для каждого аргумента:

touch file1
 touch file2
 touch file3

Как выполнить несколько команд

Чтобы запустить несколько команд с помощью xargs, используйте параметр -I. Он работает, определяя replace-str после -I, а затем все вхождения replace-str заменяются аргументом, переданным xargs.

Следующий пример xargs выполнит две команды: сначала создаст файлы с помощью touch, а затем выведет список файлов с помощью команды ls:

echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }'
-rw-r--r-- 1 noviello users 0 Oct 16 01:52 file1
 -rw-r--r-- 1 noviello users 0 Oct 16 01:52 file2
 -rw-r--r-- 1 noviello users 0 Oct 16 01:52 file3

Обычно для replace-str используется %, однако вы можете использовать другой заполнитель, например ARGS:

echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }'

Как указать разделитель

Используйте параметр -d ( --delimiter ) для установки пользовательского разделителя, который может быть одиночным символом или управляющей последовательностью, начинающейся с \.

В следующем примере мы используем ; как разделитель:

echo "file1;file2;file3" | xargs -d \; -t touch
touch file1 file2 file3

Как прочитать элементы из файла

Команда xargs также может считывать элементы из файла, а не из стандартного ввода. Для этого используйте параметр -a ( --arg-file ), за которым следует имя файла.

В следующем примере команда xargs прочитает файл ips.txt и пропингует каждый IP-адрес.

8.8.8.8
 1.1.1.1

Мы также используем параметр -L 1, который указывает команде xargs читать по одной строке за раз. Если этот параметр опущен, все IP-адреса будут переключаться на одну команду ping.

xargs -t -L 1 -a ips.txt ping -c 1
ping -c 1 8.8.8.8
 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
 64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=68.1 ms...
 ping -c 1 1.1.1.1
 PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
 64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=21.4 ms

Использование xargs с поиском

xargs часто используется вместе с командой find. Вы можете использовать find для поиска определенных файлов, а затем использовать xargs для выполнения операций с этими файлами.

Чтобы избежать проблем с именами файлов, которые содержат символы новой строки или другие специальные символы, всегда используйте параметр -print0, который заставит find печатать полное имя файла, за которым следует нулевой символ. Этот вывод можно правильно интерпретировать с помощью xargs с помощью опции -0, ( --null ).

В следующем примере find напечатает полные имена всех файлов в каталоге /var/www/.cache, а xargs передаст пути к файлам команде rm:

find /var/www/.cache -type f -print0 | xargs -0 rm -f

Используйте xargs для обрезки пробелов

xargs также можно использовать как инструмент для удаления пробелов с обеих сторон заданной строки. Просто перенаправьте строку на команду xargs, и она сделает разрез:

echo " Long line " | xargs
Long line

Это может быть полезно при сравнении строк в сценариях оболочки.

#!/bin/bash

 VAR1=" Noviello "
 VAR2="Noviello"

 if [[ "$VAR1" == "$VAR2" ]]; then
 echo "Strings are equal."
 else
 echo "Strings are not equal."
 fi

 ## Using xargs to trim VAR1
 if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then
 echo "Strings are equal."
 else
 echo "Strings are not equal."
 fi
Strings are not equal.
 Strings are equal.

Вывод

К настоящему времени вы должны хорошо понимать, как использовать команду xargs Linux. Для получения более подробной информации о параметрах xargs введите следующую команду:

manx xargs

Support us with a

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.