Bash Xargs — сложный пример

Когда вы только начинаете усердно изучать программирование на bash, никто не говорит вам о команде xargs. С тех пор вам удалось собрать достаточно xargs, чтобы обойтись без лишних поломок. Теперь вы задаетесь вопросом — а как насчет всех остальных вариантов? Я могу это сделать? Что, если я захочу…?

К настоящему времени вы, вероятно, уже достаточно хорошо понимаете, как выполнять команду в bash. Но что, если вы хотите выполнять потоки команд последовательно, а иногда и параллельно? Именно здесь мы и обнаруживаем, что используем xargs.

Здесь мы надеемся ответить на все эти вопросы и многое другое о bash и команде xargs на примере.

Содержание
  1. Что такое xargs в bash?
  2. Параметры Xargs с примерами bash
  3. Xargs info
  4. Xargs help
  5. Версия Xargs
  6. Ограничения Xargs
  7. Подробный Xargs
  8. Поведение Xargs
  9. Xargs null
  10. Xargs interactive
  11. Файл Xargs
  12. Xargs replace
  13. Xargs parallel
  14. Разделитель Xargs
  15. Примеры xargs в Bash
  16. Примеры команды Bash xargs
  17. Пример) Сделайте свой собственный ввод: весело с xargs без ввода
  18. Пример) Использование xargs в качестве заполнителя для интерактивных каналов
  19. Пример) Используйте xargs как заполнитель для интерактивных аргументов
  20. Пример) Генератор статических сайтов
  21. Bash Примеры сценария xargs
  22. Пример) Использование xargs для создания квадратных матриц
  23. Примеры практического использования Bash xargs g>
  24. Пример) Поиск в файлах шаблона с помощью xargs grep
  25. Пример) Установите программное обеспечение из списка с помощью apt-get в Ubuntu
  26. Пример) Curl seige с использованием xargs в bash
  27. Отладка Bash xargs
  28. Пример) Отладка xargs с использованием размера стандартного вывода ошибок
  29. Функции Bash xargs
  30. Заключение

Что такое xargs в bash?

xargs — это внешняя команда, используемая для преобразования стандартного ввода в аргументы командной строки , которая, как говорят, обозначает «расширенные аргументы». Он был в основном создан для использования с командами, не предназначенными для обработки конвейерного или стандартного ввода, таких как rm, cp, echo 1 и другими внешними командами, принимающими только аргументы в качестве параметров.

1 Хотя в большинстве систем есть команда echo, echo является встроенной функцией bash; То есть, если не вызывается команда echo, используется встроенное echo. Точно так же встроенные команды bash не знают о конвейерном вводе.

Параметры Xargs с примерами bash

Давайте рассмотрим xargs и его параметры с примерами в bash. Наряду с традиционной обработкой параметров командной строки, ожидаемой с помощью xargs, параметры сгруппированы по объектам, таким как получение информации или изменение поведения.

Xargs info

Вот параметры, предоставляющие информацию о xargs.

Xargs help

xargs —help
Использование: xargs [OPTION] … COMMAND [INITIAL-ARGS] …
Выполнить COMMAND с аргументами INITIAL-ARGS и другими аргументами, считываемыми из ввода.

Обязательные и необязательные аргументы для длинные параметры также являются
обязательными или необязательными для соответствующего короткого параметра.
-0, —null элементы разделяются нулем, а не пробелами;
отключает обработку кавычек и обратной косой черты и
логическую обработку EOF
-a, — arg-file = FILE читать аргументы из ФАЙЛА, а не из стандартного ввода
-d, —delimiter = CHARACTER элементы во входном потоке разделяются CHARACTER,
не пробелами; отключает обработку кавычек и обратной косой черты
и логическую обработку EOF
-E END устанавливает логическую строку EOF; если END встречается как строка
ввода, остальная часть ввода игнорируется
(игнорируется, если было указано -0 или -d)
-e, —eof [= END] эквивалентно -E END, если указано END;
в противном случае нет строки конца файла
-IR то же, что и —replace = R
-i, —replace [= R] заменить R в INITIAL-ARGS именами, прочитанными
из стандартного ввода; если R не указан,
предположим, что {}
-L, —max-lines = MAX-LINES использовать не более MAX-LINES непустых строк ввода на
командную строку
-l [MAX-LINES] аналогично -L, но по умолчанию используется не более одной не —
пустой строки ввода, если MAX-LINES не указан
-n, —max- args = MAX-ARGS использовать не более MAX-ARGS аргументов в командной строке
-P, —max-procs = MAX-PROCS запускать не более MAX-PROCS процессов одновременно
-p, — интерактивное приглашение перед запуском команд
— process-slot-var = VAR установить переменную среды VAR в дочерних процессах
-r, —no-run-if-empty, если аргументов нет , то не запускайте КОМАНДУ;
, если эта опция не указана, КОМАНДА будет
запущена хотя бы один раз
-s, —max-chars = MAX-CHARS limit length из командной строки в MAX-CHARS
— show-limits показать ограничения на длину командной строки
-t, —verbose команды печати перед их выполнением
-x, — выход выйти, если размер (см. -s) превышено
— помочь отобразить эту справку и выйти
— версия вывести информацию о версии и выйти

Обратитесь к справке xargs как к быстрой справке по Использование и параметры xargs.

Версия Xargs

xargs —version
xargs (GNU findutils) 4.6.0

Ограничения Xargs

Даже у xargs есть ограничения. Параметр –show-limits для xargs показывает ограничения, используемые xargs перед запуском команд. Фактические ограничения зависят от вашей среды. Однако для большинства пользователей этого достаточно. Пределы можно настроить в командной строке, см. Примеры.

Пример) Ограничения xargs вашей среды
xargs —show-limits
Ваш переменные среды занимают 6234 байта
Верхний предел длины аргумента POSIX (эта система): 23718
Наименьший допустимый верхний предел длины аргумента POSIX (все системы): 4096
Максимальная длина команда, которую мы могли бы использовать: 17484
Размер фактически используемого буфера команд: 23718
Максимальный параллелизм (—max-procs не должен быть больше): 2147483647

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

Предупреждение: эхо будет запущено хотя бы один раз. Если вы не хотите, чтобы это произошло, нажмите клавишу прерывания.

Обратите внимание, что команда, которая будет запускаться как следствие xargs, — это echo, команда xargs по умолчанию.

Пример) Ограничения Xargs с настроенным ограничением буфера команд
xargs —show-limits -s 1
Переменные среды занимают 9479 байт
Верхний предел длины аргумента POSIX (эта система): 20473
Наименьший допустимый верхний предел длины аргумента POSIX (все системы): 4096
Максимум длина команды, которую мы могли бы использовать: 10994
Размер фактически используемого буфера команд: 1
Максимальный параллелизм (—max-procs не должен быть больше): 2147483647

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

Примечание эти ошибки появятся внизу после предупреждений, если таковые имеются. У нас есть ошибка «xargs: не может поместиться один аргумент в пределах ограничения размера списка аргументов», что просто означает, что мы пытаемся работать за пределами разрешенного размера командного буфера, который установлен на символ.

Буфер команд содержит команду, за которой следуют все аргументы, включая пробелы.
В случае команды в этом примере параметра xargs, буфер команд имеет вид

«echo «

, который содержит 4 символа.
Итак, нам нужно установить размер командного буфера на значение больше или равное 5 следующим образом. Обратите внимание, что потребление буфера команд будет равно length_of_command + length_args_including_spaces_plus_one + 1.

xargs —show-limits -s 5

# Больше никаких «xargs: не может поместиться один аргумент в пределах ограничения размера списка аргументов» error

Но что, если наша команда имеет аргументы?

да | xargs -t —show-limits -t -s 6 # будет работать со следующим выводом
echo y

Подробный Xargs

lhs | xargs -t other_xargs_options_if_any | rhs

Параметр -t может использоваться для отображения команд, запускаемых xargs, в качестве вывода на fd2, стандартная ошибка. То есть xargs -t можно обнулить, перенаправив стандартную ошибку на/dev/null следующим образом.

xargs -t 2>/dev/null
Пример) Да один раз
да | head -n 5 | xargs -t true

true yyyyy

Пример) Да 5 раз
да | head -n 5 | xargs -t -I {} true {}

true y
true y
true y
true y
true y

Поведение Xargs

Ни одна команда не завершится без параметров для изменения поведения во время выполнения. Xargs ничем не отличается. Вот параметры, позволяющие изменить его поведение.

Xargs null

lhs | xargs -0 other_xargs_options_if_any | rhs

Параметр –0 может использоваться, чтобы указать xargs использовать null вместо пробелов. Он также отключает кавычки и escape-последовательности.

yes | head -n 5 | sed «s/.*/cul-» de «- ‘sac’/» | xargs -I {} echo -en » n x00 {}»

тупик
тупик
тупик- мешок
тупик
тупик

да | head -n 5 | sed «s/.*/cul-» de «- ‘sac’/» | xargs -0 -I {} echo -en » n x00 {}»

cul- «de» — ‘sac’
cul- «de» — ‘sac ‘
тупик — «де» -‘ мешок ‘
тупик- «де» -‘ мешок ‘
тупик- «де» -‘ мешок ‘

Случай использования Xargs null

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

Предположим, у вас есть каталог «abc», включая пробелы в имени каталога.

ls «abc»
de/fg/h/’ijk l’/

Вы хотите запустить команду для каждого каталога в «abc», используя команду find.

Вы можете попробовать следующее:

найти «a b c» -тип d | xargs du -d 0 –h

du: нет доступа к ‘a’: нет такого файла или каталога
du: нет доступа ‘b’: нет такого файла или каталога
du: нет доступа к ‘c’: нет такого файла или каталога
du: нет доступа ‘a’: нет такого файла или каталога
du: нет доступа к ‘b’: нет такого файла или каталог
du: нет доступа к ‘c/de’: нет такого файла или каталога
du: нет доступа ‘a’: нет такого файла или каталога
du: нет доступа ‘ b ‘: нет такого файла или каталога
du: нет доступа’ c/fg ‘: нет такого файла или каталога
du: нет доступа’ a ‘: нет такого файла или каталога
du: нет доступа к ‘b’: нет такого файла или каталога
du: нет доступа ‘c/h’: нет такого файла или каталога
du: нет доступа к ‘a’: нет такого файла или каталог
du: нет доступа к ‘b’: нет такого файла или каталога
du: нет доступа ‘c/i’: нет такого файла или каталога
du: нет доступа ‘ j ‘: нет такого файла или каталога
du: нет доступа’ k ‘: нет такого файла или каталога
du: нет доступа’ l ‘: нет такого файла или директива tory

Это работает неправильно, потому что имена наших каталогов пронизаны пробелами. Это не было вашим намерением.

Вы можете исправить это, добавив замену xargs, то есть -I {} следующим образом.

find «abc» -тип d | xargs -i du -d 0 -h {}

0 abc
0 abc/de
0 abc/fg
0 abc/h
0 abc/ijkl

Он работает правильно при использовании замены xargs. Обратите внимание, что мы использовали -i, что является сокращением для -I {}.

Другой способ добиться того же результата — использовать xargs null, –null в сочетании с параметром find -print0 как следует.

найти «abc» -тип d -print0 | xargs —null -i du -d 0 -h {}

0 abc
0 abc/de
0 abc/fg
0 abc/h
0 abc/ijkl

Отлично! Теперь у нас есть несколько способов проделать свой путь вглубь вселенной файловых систем, не беспокоясь о столкновении с космическим мусором в нашем путешествии. Отлично.

Xargs interactive

Может быть, вы не доверяете xargs запускать все команды без подтверждения. В этом случае xargs interactive или -p — это опция, которая вам нужна для управления тем, какие команды запускаются xargs, как показано ниже.

find «a b c» -type d -print0 | xargs —null -i -p du -d 0 -h {}

du -d 0 -habc? …
du -d 0 -habc/de? …
du -d 0 -habc/fg? … y
0 abc/fg
du -d 0 -habc/h? … Да
0 abc/h
du -d 0 -habc/ijkl? … no

Здесь любая команда, начинающаяся с ‘y’ или ‘Y’ запущен. В противном случае команды игнорируются.

Файл Xargs

У вас уже есть файл arg-file, готовый для чтения в xargs. Ваша программа может ждать где-то в каком-то каталоге, чтобы кто-то другой или другой ваш экземпляр поместили в arg-файл. В этом случае вы можете указать файл в качестве опции для xargs с помощью -a arg-file вместо использования cat file | xargs… Примеры файлов Xargs приведены ниже.

Ради удовольствия, давайте превратим ваши процедуры очистки рабочего стола в arg-файл, который мы сможем использовать.

ls cleanup-desktop | tee arg-файл

190605_cleanup_desktop_files_sh.txt
190605_cleanup_desktop_lnk_files_sh.txt
190605_cleanup_desktop_un_files_sh.txt

pdiv> файл # pdiv> процедура, которую можно запустить с помощью bash. Это означает, что мы будем использовать команду bash.

Давайте запустим процедуры очистки с помощью xargs.

xargs -a arg-file -i -P 99 bash -c ‘{эхо {}; . очистка-рабочий стол/{}; } ‘

190605_cleanup_desktop_files_sh.txt
190605_cleanup_desktop_lnk_files_sh.txt
190605_cleanup_desktop_un_files_sh.txt

И это работает # br> br> На тот случай, если нам нужно указать arg-файл вместо использования конвейерного ввода, нам пригодится опция файла xargs.

Xargs replace

lhs_if_any | xargs -i other_args_etc | rhs_if_any

И последнее, но не менее важное: xargs replace -i позволяет вам получить полный контроль над форматом команды перед ее запуском. Можно использовать любой символ. Однако, следуя соглашению, большинство программистов на bash используют этот {} или этот%. Обратите внимание, что по умолчанию используется {}. -i сообщает xargs, что вы будете использовать значение по умолчанию. И это считается стенографией. -I, за которым следует замещающий символ по вашему выбору, сообщает xargs, какой символ вы будете использовать. Избегайте использования общих символов, таких как буква а. Это нарушит ваш код больше, чем любой пробел или перевод строки.

Xargs parallel

lhs_if_any | xargs -P n_ge_1 other_args_etc | rhs_if_any

Xargs parallel -P позволяет выполнять команды одновременно, а не последовательно. См. Допустимые аргументы для n_ge_1 или параллелизма в xargs limits –show-limits. Например, если

Максимальный параллелизм (—max-procs не должен быть больше): 2147483647

Вы можете установить — P 2147483647 без ошибок. На практике вы можете найти более приятный параметр, например -P 99, который улучшает общую производительность без увеличения накладных расходов на управление параллельными процессами.

Ниже приведены примеры, показывающие, как использование параллельного xargs может улучшить производительность.

Пример) Последовательный подсчет по сравнению с параллельным с использованием xargs

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

time эхо {1..1000} | xargs ‘-d’ -i bash -c ‘echo {}’

998
999
1000

real 1m13.927s
user 0m6.994s
sys 0m15.184s

Теперь посмотрим, что произойдет, если мы будем считать время параллельно с использованием xargs.

эхо времени {1..1000} | xargs -P 200 ‘-d’ -i bash -c ‘echo {}’

998
999
1000

реальный 0m13.554s
пользователь 0m6.446s
sys 0m14.293s

Существенное улучшение производительности наблюдается при использовании параллельных xargs для выполнения простых команд без общих ресурсов.

Пример) Сравнение порядка и времени параллельных xargs

Давайте посмотрим, что происходит, когда команда потребляет время процессора.

time echo {1..10} | xargs ‘-d’ -i bash -c ‘sleep $ (($ {RANDOM}% 2)); echo {} ‘
1
2
3
4
5
6
7
8
9
10

реальный 0m5.601s
пользователь 0m0.180s
sys 0m0.334s

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

Теперь посмотрим, что происходит, когда одна и та же команда выполняется параллельно.

эхо времени {1..10} | xargs -P 10 ‘-d’ -i bash -c ‘sleep $ (($ {RANDOM}% 2)); echo {} ‘
3
4
6
7
8
1
2
5
9
10

реальный 0m1,257s
пользователь 0m0.060s
sys 0m0.225s

Команды 1, 2, 5 и 9 перешли в режим сна. Однако нам удалось сократить время выполнения
на 78 процентов.

Параллельное заключение Xargs

Простое добавление xargs parallel в качестве параметра командной строки может повысить производительность в десять раз. Однако следует проявлять осторожность при использовании процедур, зависящих от порядка, или когда команды совместно используют ресурсы.

Разделитель Xargs

lhs_if_any | xargs ‘-dc’ other_args_etc | rhs_if_any

Xargs delimiter -d позволяет вам установить разделитель элементов на любой символ c так же, как символы-разделители устанавливаются в команде cut.

По умолчанию -dc устанавливается на пробел, созданный символом новой строки -d x0a.

При использовании xargs null -0 для -dc устанавливается нулевой символ -d x00.

Например, вы можете установить в качестве разделителя пробел, то есть -dc — это ‘-d’ в командной строке или в вашем сценарии bash.

Вы можете установить разделитель на символ запятой, т.е. -dc — это ‘-d,’.

Параметр разделителя в xargs -d позволяет вам установить разделитель элементов на любой символ вы хотите.

Примеры xargs в Bash

Здесь мы рассмотрим примеры использования команды xargs в bash, включая пример использования в команде строка, а также скрипты.

Примеры команды Bash xargs

Здесь мы рассмотрим пример использования команды xargs в командной строке в bash включая пример использования с p и без него iped input.

Пример) Сделайте свой собственный ввод: весело с xargs без ввода

Что xargs делает дома один?

xargs
Привет, кто-нибудь дома?

(Ctrl-D)

Привет, кто-нибудь дома? …

Похоже, мы вернули наш вопрос в качестве ответа, но, похоже, это просто эхо.

Почему?

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

xargs
Привет, есть ли кто-нибудь дома?

(Control-D) 2

Неявно генерирует эквивалентное выражение командной строки echo

echo Привет, есть ли кто-нибудь дома? …

2 В сценарии heredoc можно использовать следующим образом.

xargs Здравствуйте, есть ли кто-нибудь дома?

EOF

echo Привет, есть ли кто-нибудь дома? …

Пример) Использование xargs в качестве заполнителя для интерактивных каналов

Использование xargs в левой части канала парадоксально 4 , поэтому давайте запустим bash в сверхограниченном режиме 5 .

4 Команды с поддержкой конвейера не нужны xargs. Неизвестные команды конвейера не знают о xargs

5 Ограниченный режим, который сбрасывает каждую строку. Другие ограничения могут быть добавлены позже.

xargs -I {} bash -cr «{}»
i = 1
echo $ {i }

echo Привет!
Привет!
!!
bash: !!: команда не найдена
i = 1; echo $ {i}
1
cd ..
bash: line 0: cd: limited

Пример) Используйте xargs как заполнитель для интерактивных аргументов

Согласно отчету о навыках разработчиков HackerRank за 2019 год 3 , «Калькуляторы — это новые игры». Все больше разработчиков моложе 38 лет продвигают калькуляторы как свой первый проект по программированию. 3 Выводы, основанные на 71 281 разработчике

Итак, давайте создадим калькулятор с использованием xargs!

_ () {эхо $ ((«$ {@}»)); } # калькулятор
while:
do
_ $ (xargs)
done
1 + 2 + 3 + 4
( Ctrl-D)
10
1-2 + 3-4 + 5
(Ctrl-D)
3
1 ** 2 + 2 ** 2
(Ctrl-D)
3
1 +
2 +
3 +
4 +
5
(Ctrl-D)
15

Пример) Генератор статических сайтов

Предположим, вы у вас есть несколько тысяч простых текстовых файлов, которые вы хотите использовать для создания статического сайта, и ни один из файлов не имеет имени index. Имена файлов включают символы ascii в нижнем регистре и дефис, если они есть.

Вот как будут выглядеть одна или две строки в терминале теоретической машины, на которой запущен bash. На машине будут и другие внешние команды, включая findutils и pandoc. Вы можете использовать любую эквивалентную команду по вашему выбору.

# мы находимся в каталоге
# видим много файлов
{
test -d «html» || mkdir -v $ {_}
найти. -mindepth 1 –maxdepth 1 -тип f
| xargs -P 6000 -i bash -c «echo {}; cat {} | sed -e ‘s/$//’ |
pandoc -thtml -o {} .html»
}
# теперь видим вдвое больше файлов, включая файлы HTML
# done

Bash Примеры сценария xargs

Пример) Использование xargs для создания квадратных матриц

Вот сценарий, который я приготовил для создания квадратных матриц с использованием xargs. В частности, он использует поведение, использующее параметр -n, и использует команду seq для последовательностей чисел, которые будут использоваться в матрицах..

#!/bin/bash
## square-matrix
## — генерирует квадратные матрицы
## версия 0.0 .1 — начальный
##################################################################################################### #########
square-matrix-help () {
{
cat квадратная матрица
1 — порядок
ПРИМЕРЫ
> квадратная матрица 1
1
> квадратная матрица 2
1 2
3 4
> квадратная матрица 3
1 2 3
4 5 6
7 8 9
EOF
}
}
квадратная матрица () {{локальный -i порядок; заказ = $ {1}; }
тест «$ {order}» || {$ {FUNCNAME} -help; возвращаться ; }
test $ {order} -gt 0 || {$ {FUNCNAME} -help; возвращаться ; }
_ () {
seq $ (($ {1} ** 2)) | xargs -n $ {1}
}
_ $ {порядок}
}
############### ################################
if [! ]
затем
true
else
exit 1 # неправильные аргументы
fi
########## #####################################
квадратная матрица $ { @}
######################################## #######
## сгенерировано create-stub2.sh v0.1.2
## в среду, 29 мая 2019 г. 13:44:06 +0900
# # см.
############################# ###################

Источник: square-matrix.sh

I также включена тестовая программа для демонстрации сценария в действии, генерирующего все квадратные матрицы размером до 10 x 10.

#!/bin/bash
## test-square-matrix
## — генерирует квадратные матрицы размером до 10 x 10
## версия 0.0.1 — исходная
########### #####################################
тест-квадрат-матрица ( ) {
test -f «square-matrix.sh»
. $ {_} 1>/dev/null
local i
для i в {1..10}
do
echo «квадратная матрица ($ { i}) «
квадратная матрица $ {i}
done
}
################# ###############################
if [$ {#} -eq 0]
затем
true
else
exit 1 # неправильные аргументы
fi
############# ##################################
тест-квадрат-матрица
######################################################################## ##
## сгенерировано create-stub2.sh v0.1.2
## в среду, 29 мая 2019 г. 13:40:08 +0900
## см.
############################################################## ###############

Источник: test-square-matrix.sh

Вот что нужно ожидайте:

bash test-square-matrix.sh | голова
квадратная матрица (1)
1
квадратная матрица (2)
1 2
3 4
квадрат- матрица (3)
1 2 3
4 5 6
7 8 9
Упражнение: улучшите отображение в терминале, применив отступы к числам

Когда мы пытаемся сгенерировать квадратную матрицу порядка 10 на 10, мы получаем следующий результат:

квадратная матрица bash. ш 10
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

В качестве упражнения расширите файл square-matrix.sh, чтобы обеспечить вывод, как показано ниже.

bash square-matrix. sh 10

001002003004005006007008009010
011 012 013 014 015 016 017 018 019 020
021022023 024 025 026 027 028 029 030
031032 033 034 035 036 037 038 039 040
041042043044045046047048 049 050
05105205305405556057058059060
061062 063 064 065 066 067 068 069 070
071072073074076077078079080
081082083084085087088089090
091092093 094 095 096 097 098 099 100

Примеры практического использования Bash xargs g>

Пример) Поиск в файлах шаблона с помощью xargs grep

list-files 1 | xargs grep -e pattern

1 list-files — это команда, возвращающая возможные пути к файлу, которые будут приняты в качестве входных данных для grep с помощью команды xargs

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

find -type f -name * .sh | wc -l
994

Существует 994 сценария bash. Посмотрим, сколько у команды xargs.

find -type f -name *. Sh | xargs grep -e xargs перечисляет все вхождения
xargs в кодовой базе.

find -type f -name *. sh | xargs grep -e xargs | wc -l
18

В базе кода 18 совпадений для xargs. Теперь мы могли бы захотеть выяснить, сколько скриптов используют xargs.

find -type f -name *. Sh | xargs grep | вырезать ‘-d:’ ‘-f1’ | sort |
uniq перечисляет сценарии с использованием xargs.

find -type f -name *. sh | xargs grep -e xargs | вырезать ‘-d:’ ‘-f1’ |
сортировать | uniq | wc -l
10

Отлично! В базе кода 10 скриптов с xargs. Посмотрим, что это такое.

find -type f -name *. ш | xargs grep -e xargs | вырезать ‘-d:’ ‘-f1’ | сортировать | uniq
vim $ (!!)

Сводка результатов

    • Поиск и уничтожение файлов, содержащих шаблон в имени файла
find $ {путь} -тип f -имя * $ {шаблон} * | xargs rm -vf
    • Вывести информацию о файлах на левой стороне канала
файлы поиска | xargs ls -al
    • Сделать файлы исполняемыми
файлы поиска | xargs chmod + x
    • Список имен файловых каталогов
файлы поиска | xargs -I {} dirname «{}»
    • Очистить все
пути к очистке | xargs rm –rvf
    • Zip-файлы
find-files-to-zip | xargs -I {} archive — $ (date +% s) {}
    • Список базовых имен файлов
файлы поиска | xargs -I {} basename {}

Пример) Установите программное обеспечение из списка с помощью apt-get в Ubuntu

При обновлении Ubuntu после резервного копирования в вашей системе вам, возможно, придется установить новое программное обеспечение. Предположим, у вас есть список программного обеспечения для установки с помощью apt-get в Ubuntu.

sudo dpkg —get-selections | grep ‘[[: space:]] install $’ |
awk ‘{print $ 1}’ & gt; install_software
# …
cat install_software | xargs sudo apt-get install

Пример) Curl seige с использованием xargs в bash

Предположим, у вас есть группа URL-адресов, ведущих к одному узлу где-то в в Интернете, и вы хотите выполнить осаду, используя curl в bash. Желательно, чтобы это был один из ваших узлов, и осада не находится в вашей производственной среде. Вот как мы устанавливаем осаду, используя xargs в bash.

#declare -f filter
filter ()
{
grep -o -e ‘loc [^ ‘ ‘-f2’
}
get-arg-file ()
{
curl https://linuxhint.com/sitemap. xml —silent
| фильтр
| xargs -i curl —silent {}
| фильтр
| xargs -i echo {}> arg-file
}
#declare -f curl
curl ()
{
echo (поддельный) $ {FUNCNAME} «$ {@}»
}
объявить -xf curl
payload ()
{
test -f «arg-file «|| return
xargs -P 1000 -a arg-file -i echo curl {} | bash 1>/dev/null
}
seige ()
{
test -f «arg-file» || get — $ {_}
payload
}
seige

Отладка Bash xargs

Когда вы сидите перед терминалом, вы босс. Однако, когда что-то идет не так, помогает, если вы знаете, как на самом деле отлаживать сценарии bash, как босс.

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

Методы

  • Размер стандартного вывода ошибок
    Если стандартная ошибка содержит 1 или более символов, что-то пошло не так
  • Сумма кодов выхода команды
    Если итог выхода коды больше 0, что-то пошло не так
  • Проверка полезной нагрузки
    Если часть полезной нагрузки отсутствует, что-то пошло не так
  • Конец проверки скрипта
  • Выполнение команд xargs как скрипта, если конец скрипта не достигнут, что-то пошло не так. Обратите внимание, что установлен errexit, и команды запускаются изнутри функции.
  • Другой метод
    Если результат отличается от ожидаемого, то, возможно, что-то пошло не так.

Пример) Отладка xargs с использованием размера стандартного вывода ошибок

Вот анонимная функция, с помощью которой мы тестируем отладку xargs с использованием стандартной ошибки.

# declare -f _, т.е. я не писал код ниже
#, если вы обнаружите, что немного устали, объявите, что я написал другой учебник на
#
как команда объявления работает в bash

_ ()
{
rm -vf errout;
touch $ {_};
echo {1..10} | xargs -x -P 10 ‘-d’ -i bash -c «test $ (($ {RANDOM}% $ {1})) -eq 0 ||
{echo {} 1> & 2; exit ;}; echo {} «2> ошибка;
тест! $ (wc }
## test
_ 1 # вероятность отказа (= 1-1/1 = 0%)
_ 2 # вероятность отказа (= 1-1/2 = 1/2 = 50%)
_ 3 # вероятность отказа (= 1-1/3 = 2/3 = 60%)

Если вы не используете стандартную ошибку для чего-либо еще, использование размера стандартной ошибки для отладки xargs — это один из методов, который может сработать для вас.

Функции Bash xargs

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

#declare -f _
_ ()
{
echo $ {@ ^^}
}
echo {a..z} {1..9} | xargs ‘-d’ -i bash -c «_ {}»
bash: _: команда не найдена

объявить –xf _
echo {a..z} {1..9} | xargs ‘-d’ -i bash -c «_ {}»
A1
A2
A3

# или
echo {a..z} {1..9} | xargs ‘-d’ -i echo «_ {}» | bash

Z7
Z8
Z9

Обратите внимание, что приведенный выше пример интерактивного сеанса можно ускорить вверх с помощью bash xargs parallel.

Заключение

Xargs — одна из многих внешних команд, которые вам лучше знать в bash . При написании этого руководства по команде xargs я сам изучил несколько дополнительных опций. Рекомендуется время от времени пересматривать. Только тогда вы сможете использовать xargs в полной мере. А пока продолжайте писать код.

Оцените статью
nanomode.ru
Добавить комментарий