@ Денис, не похоже на это: ls | xargs -L2 echoи ls -1 | xargs -L2 echoдает два разных выхода. Бывшее все на одной линии.
Алекс Будовски
2
@ Алекс: Я получаю тот же вывод.
Приостановлено до дальнейшего уведомления.
6
xargsможет запускать только исполняемые файлы, а не функции оболочки или встроенные команды оболочки. Для первых лучшим решением, вероятно, является решение с readпетлей.
Пабук
12
Я хотел бы, чтобы этот ответ включал объяснение того, для чего -L1.
Wyck
164
Вы можете использовать базовую операцию prepend в каждой строке:
ls -1|while read line ;do echo $line ;done
Или вы можете направить вывод в sed для более сложных операций:
Команда sed, похоже, не работает: sh: cho: not found a sh: cho: not foundпохоже, она принимает eв echo команду sed или что-то в этом роде.
Алекс Будовски
+1 за whileцикл. cmd1 | while read line; do cmd2 $line; done, Или while read line; do cmd2 $line; done < <(cmd1)который не создает подоболочку. Это упрощенная версия вашей sedкоманды:sed 's/.*/echo &/'
Приостановлено до дальнейшего уведомления.
1
@ Алекс: изменить двойные кавычки на одинарные.
Приостановлено до дальнейшего уведомления.
5
Цитируйте "$line"цикл while, чтобы избежать разделения слов.
ignis
3
Попробуйте использовать, read -r lineчтобы не readиспортить экранированные символы. Например echo '"a \"nested\" quote"' | while read line; do echo "$line"; doneдает "a "nested" quote", который потерял свое вытекание. Если мы это сделаем, echo '"a \"nested\" quote"' | while read -r line; do echo "$line"; doneмы получим, "a \"nested\" quote"как ожидалось. См. Wiki.bash-hackers.org/commands/builtin/read
Обратите внимание, что если рассматриваемая команда принимает несколько аргументов, то использование xargs почти всегда более эффективно, поскольку она вызывает только одну утилиту вместо нескольких раз.
Стоит описать правильное / безопасное использование xargs, т.е. printf '%s\0' * | xargs -0 ...- иначе, это довольно опасно с именами файлов с пробелами, кавычками и т. д.
Чарльз Даффи
8
Вы действительно можете использовать sed для этого, при условии, что это GNU sed.
Фантастика. Я забыл поставить команду e в конце, но сделал это, увидев ваш ответ, и это сработало. Я пытался добавить случайный идентификатор между 1000 и 15000, когда SED соответствует строке. cat /logs/lfa/Modified.trace.log.20150904.pw | sed -r 's/^(.*)(\|006\|00032\|)(.*)$/echo "\1\2\3 - ID `shuf -i 999-14999 -n 1`"/e'
Xargs не с обратными слешами, цитаты. Это должно быть что-то вроде
ls -1|tr \\n \\0|xargs -0-iTHIS echo "THIS is a file."
опция xargs -0:
-0,--null
Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are
not special (every character is taken literally).Disables the end of file string, which is treated like
any other argument.Useful when input items might contain white space, quote marks, or backslashes.The
GNU find -print0 option produces input suitable for this mode.
ls -1завершает элементы символами новой строки, поэтому trпереводит их в нулевые символы.
Этот подход примерно в 50 раз медленнее, чем итерация вручную for ...(см. Ответ Майкла Аарона Сафяна) (3,55 с против 0,066 с). Но для других команд ввода, таких как locate, find, чтение из файла ( tr \\n \\0 <file) или аналогичных, вы должны работать с xargsэтим.
Лучше, но не идеально. find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 commandбудет обрабатывать случаи, когда вывод ls -1неоднозначен; используйте, -printf '%P\0'а не -print0если вы не хотите ведущий ./на каждом.
Чарльз Даффи
1
мне нравится использовать gawk для запуска нескольких команд в списке, например
ls -l | gawk '{system("/path/to/cmd.sh "$1)}'
однако побег от убегающих персонажей может стать немного волосатым.
ls -1
может быть примером здесь, но важно помнить, что не очень хорошо разбирать выводls
. См .: mywiki.wooledge.org/ParsingLsОтветы:
Это, вероятно, самый простой в использовании
xargs
. В твоем случае:-L
Флаг обеспечивает вход правильно читать. Со страницы руководстваxargs
:источник
ls
автоматически делает-1
в трубе.ls | xargs -L2 echo
иls -1 | xargs -L2 echo
дает два разных выхода. Бывшее все на одной линии.xargs
может запускать только исполняемые файлы, а не функции оболочки или встроенные команды оболочки. Для первых лучшим решением, вероятно, является решение сread
петлей.-L1
.Вы можете использовать базовую операцию prepend в каждой строке:
Или вы можете направить вывод в sed для более сложных операций:
источник
sh: cho: not found a sh: cho: not found
похоже, она принимаетe
в echo команду sed или что-то в этом роде.while
цикл.cmd1 | while read line; do cmd2 $line; done
, Илиwhile read line; do cmd2 $line; done < <(cmd1)
который не создает подоболочку. Это упрощенная версия вашейsed
команды:sed 's/.*/echo &/'
"$line"
цикл while, чтобы избежать разделения слов.read -r line
чтобы неread
испортить экранированные символы. Напримерecho '"a \"nested\" quote"' | while read line; do echo "$line"; done
дает"a "nested" quote"
, который потерял свое вытекание. Если мы это сделаем,echo '"a \"nested\" quote"' | while read -r line; do echo "$line"; done
мы получим,"a \"nested\" quote"
как ожидалось. См. Wiki.bash-hackers.org/commands/builtin/readВы можете использовать цикл for :
Обратите внимание, что если рассматриваемая команда принимает несколько аргументов, то использование xargs почти всегда более эффективно, поскольку она вызывает только одну утилиту вместо нескольких раз.
источник
printf '%s\0' * | xargs -0 ...
- иначе, это довольно опасно с именами файлов с пробелами, кавычками и т. д.Вы действительно можете использовать sed для этого, при условии, что это GNU sed.
Как это устроено:
источник
cat /logs/lfa/Modified.trace.log.20150904.pw | sed -r 's/^(.*)(\|006\|00032\|)(.*)$/echo "\1\2\3 - ID `shuf -i 999-14999 -n 1`"/e'
Если cmd имеет большой вывод:
источник
cmd
в выводе есть пробелы, первый потерпит неудачу.Xargs не с обратными слешами, цитаты. Это должно быть что-то вроде
опция xargs -0:
ls -1
завершает элементы символами новой строки, поэтомуtr
переводит их в нулевые символы.Этот подход примерно в 50 раз медленнее, чем итерация вручную
for ...
(см. Ответ Майкла Аарона Сафяна) (3,55 с против 0,066 с). Но для других команд ввода, таких как locate, find, чтение из файла (tr \\n \\0 <file
) или аналогичных, вы должны работать сxargs
этим.источник
Лучший результат для меня:
источник
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 command
будет обрабатывать случаи, когда выводls -1
неоднозначен; используйте,-printf '%P\0'
а не-print0
если вы не хотите ведущий./
на каждом.мне нравится использовать gawk для запуска нескольких команд в списке, например
однако побег от убегающих персонажей может стать немного волосатым.
источник