2015-01-29 1 views
4

Возможно ли выполнить grep результат команды, порожденной xargs?Выполнить grep по отдельным результатам команды, порожденной xargs

В качестве примера я пытаюсь следующую команду

findbranch prj-xyz -latest|sed 's/^\(.*\/.*\)@@.*$/\1/'|xargs -I {} cleartool lsh {}|grep -m 1 'user' 

, но кажется, что Grep выполняется на весь результирующий набор, возвращаемый findbranch, а отдельные результаты LSH

В качестве примера того, что я хочу сверху, для каждого файла, возвращаемого findbranch и sed, я хотел бы найти ту версию, которая была в последний раз модифицирована определенным пользователем.

Примечание Если в случае, если это вас беспокоит, findbranch - это внутренняя утилита.

ответ

0

Почему бы не использовать двухфазную команду? что-то вроде

findbranch prj-xyz -latest|sed 's/^\(.*\/.*\)@@.*$/\1/' > /tmp/x ; for x in `cat /tmp/x`; do echo $x; done 

После того, как вы видите $x является входом, что нужно для xargs вы можете дополнительно манипулировать

2

Как насчет этого подхода?

.... | xargs -I {} bash -c "cleartool lsh {}|grep -m 1 'user'" 

Я думаю, этот ответ сами за вас ...

+0

Да, я вижу вашу точку зрения. Я просто задавался вопросом, можем ли мы сделать это, не создавая оболочку для каждой строки ввода. Но похоже, что это единственный возможный вариант – Abhijit

0

Если у вас есть GNU Parallel это должно работать:

findbranch prj-xyz -latest|sed 's/^\(.*\/.*\)@@.*$/\1/'|parallel cleartool lsh {}'|'grep -m 1 'user' 

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