Почему xargs работает с некоторыми командами, но не работает с другими?

Если присвоение переменной задано как файловый операнд в командной строке скрипта awk, это присвоение будет выполнено, когда awkдойдет до этой точки в использовании файловых операндов.

Пример:

awk -f script.awk a=1 file1 file2 a=2 file3 a=3 file4

Здесь для переменной awkaбудет установлено значение 1перед чтением file1. Переменная сохранит это значение (, если оно не будет изменено программой awk)до тех пор, пока файл file2не будет прочитан. Затем устанавливается значение 2и т. д.

.

Это означает, что ваша командная строка правильно устанавливает переменную IDв 4перед чтением text.sql.

Разница между -v ID=4и этим заключается в том, что IDне будет установлен ни в одном блоке BEGIN. Использование -v ID=4устанавливает IDв 4, и будет доступно в блоках BEGIN.

Еще одна проблема с вашим кодом заключается в том, что вы используете IDкак буквальную строку в

if ($1 ~/--/ && $2 ~/^ID/){

То есть вы проверяете, начинается ли второе поле со строки ID.

Также кажется, что вы ожидаете, что ваш цикл whileзациклится на строках файла. Цикл чтения строк -по -уже встроен в способ работы awk, и очень редко требуется его явное описание.

Вместо этого

$1 == "--" && $2 == ID { getline; print }

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

Чтобы вместо этого использовать регулярные выражения,

$0 ~ "^-- " ID "$" { getline; print }

Это будет соответствовать каждой строке, которая начинается с двойного дефиса и одиночного пробела, за которым следует значение ID, а конец строки($соответствует концу строки ). Строка после совпадающей строки будет напечатана.

0
22.08.2021, 02:43
2 ответа

В дополнение к «использованию -n1», упомянутому в первом ответе, ваша оболочка могла иметь встроенную -версию некоторых команд. Если команда вызывается из другой программы (, например, из xargs), она вызовет внешнюю программу вместо встроенной -версии оболочки.

В частности, printfвстроен в Bash и несколько других оболочек, а встроенная в Bash -версия будет повторять формат столько раз, сколько необходимо для использования всех аргументов.

Например, используя встроенную версию -Bash,

printf '%s and %s\n' How now brown cow

выведет 2 строки, тогда как

/usr/bin/printf '%s and %s\n' How now brown cow

может жаловаться, что у него слишком много аргументов, в зависимости от установленной версии.

1
22.08.2021, 04:00

Как правило, я бы избегал xargs.

Большинство примеров, которые вы найдете в Интернете, ненадежны. -Они неожиданно сломаются, если среда не будет соответствовать предположениям человека, написавшего код.

Даже в примере, приведенном в этом вопросе, есть ошибка :он использует find... -print0, но затем используетxargsбез-0.

Кроме того, большинство применений xargsне нужны. В частности, когда он используется в сочетании с find, более надежным и менее подверженным ошибкам -использование выражения -execвнутри find.

Приведенный пример можно заменить на:

find. -type f -exec md5sum {} +
1
22.08.2021, 04:08

Теги

Похожие вопросы