4 ответов:
работа по интерпретации символа трубы как инструкции для запуска нескольких процессов и передачи вывода одного процесса на вход другого процесса является обязанностью оболочки (/bin / sh или эквивалент).
в вашем примере вы можете использовать свою оболочку верхнего уровня для выполнения трубопровода следующим образом:
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'С точки зрения эффективности это приводит к затратам на один вызов find, многочисленные вызовы zcat и один вызов agrep.
это приведет к появлению только одного процесса agrep, который будет обрабатывать все выходные данные, полученные многочисленными вызовами zcat.
Если вы по какой-то причине хотите вызывать agrep несколько раз, вы можете сделать:
find . -name 'file_*' -follow -type f \ -printf "zcat %p | agrep -dEOE 'grep'\n" | shэто создает список команд, использующих каналы для выполнения, а затем отправляет их в новую оболочку для фактического выполнения. (Опуская окончательный "| sh" - это хороший способ отладки или выполнения сухих запусков командных строк, таких как этот.)
С точки зрения эффективности это приводит к затратам на один вызов find, один вызов sh, многочисленные вызовы zcat и многочисленные вызовы agrep.
наиболее эффективное решение с точки зрения количества вызовами команды-это предложение от Павла Томблин:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'... чего стоит один вызов найти, один вызов команды xargs, несколько вызовов zcat выступает и один вызов agrep.
вы также можете трубить в
whileцикл, который может выполнять несколько действий над файлом, которыйfindнаходит. Так вот один для просмотра вjarархивы для данного файла класса java в папке с большим дистрибутивомjarфайлыfind /usr/lib/eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; doneключевым моментом является то, что
whileцикл содержит несколько команд, ссылающихся на переданное имя файла, разделенное точкой с запятой, и эти команды могут включать каналы. Поэтому в этом примере я повторяю имя соответствующего файла, а затем список что находится в архиве фильтрации для данного имени класса. Выходные данные выглядят например:/usr/lib/eclipse/plugins / org.затмение.ядро.contenttype.source_3.4.1.R35x_v20090826-0451.сосуд /usr/lib/eclipse/plugins / org.затмение.ядро.привязка данных.observable_1.2.0.M20090902-0800.сосуд орг/затмение/основных/привязка данных/наблюдаемых/список/IObservableList.класс /usr/lib/eclipse/plugins / org.затмение.поиск.source_3.5.1.r351_v20090708-0800.сосуд /usr/lib/eclipse/plugins / org.затмение.JDT, предназначенным.подходящий.ядро.source_3.3.202.R35x_v20091130-2300.сосуд /usr/lib/eclipse/plugins / org.затмение.резюме.source_1.0.400.v201002111343.сосуд /usr/lib/eclipse/plugins / org.затмение.помощь.appserver_3.1.400.v20090429_1800.банку
in моя оболочка bash (xubuntu10. 04/xfce) действительно делает соответствующее имя класса полужирным как
fgrepвыделяет соответствующую строку; это делает его очень легко сканировать вниз по списку сотенjarфайлы, которые были найдены и легко увидеть любые совпадения.в windows вы можете сделать то же самое с:
for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableListобратите внимание, что в этом на windows разделитель команд является " & "не"; "и что" @ " подавляет Эхо команды, чтобы дать аккуратный вывод так же, как linux найти выход выше; хотя
findstrне делает соответствующую строку жирным шрифтом, поэтому вам нужно посмотреть немного ближе к выходу, чтобы увидеть имя соответствующего класса. Оказывается, что команда windows ' for ' знает довольно много трюков, таких как зацикливание текстовых файлов...наслаждайтесь
Comments