Osobiście mój ulubiony (wymaga bash i innych rzeczy, które są standardowe w większości dystrybucji Linuksa)
Szczegóły mogą bardzo zależeć od tego, co wynikają z dwóch rzeczy i jak chcesz je połączyć ...
Treść poleceń 1 i 2 po sobie w danych wyjściowych:
cat <(command1) <(command2) > outputfile
Lub jeśli obie komendy generują alternatywne wersje tych samych danych, które chcesz zobaczyć obok siebie (użyłem tego z snmpwalk; liczby z jednej strony i nazwy MIB z drugiej):
paste <(command1) <(command2) > outputfile
Lub jeśli chcesz porównać dane wyjściowe dwóch podobnych poleceń (powiedz znaleźć w dwóch różnych katalogach)
diff <(command1) <(command2) > outputfile
Lub jeśli są uporządkowane dane wyjściowe, scal je:
sort -m <(command1) <(command2) > outputfile
Lub uruchom oba polecenia jednocześnie (może to jednak trochę zaszyfrować):
cat <(command1 & command2) > outputfile
Operator <() ustawia nazwany potok (lub / dev / fd) dla każdego polecenia, przesyłając dane wyjściowe tego polecenia do nazwanego potoku (lub odwołania do uchwytu pliku / dev / fd) i przekazuje nazwę w wierszu polecenia. Istnieje odpowiednik> (). Możesz zrobić: command0 | tee >(command1) >(command2) >(command3) | command4
na przykład jednocześnie wysłać dane wyjściowe jednego polecenia do 4 innych poleceń.
grep --line-buffered
- przydatny do jednoczesnegogrep
„ingtail
wielu plików dziennika. patrz stackoverflow.com/questions/10443704/line-buffered-catMożesz dołączyć dwie pary do drugiej
cat
, jak pokazuje goryl.Możesz także utworzyć FIFO, skierować do niego wyjście poleceń, a następnie odczytać z FIFO dowolnym innym programem:
Szczególnie przydatny w przypadku programów, które tylko zapisują lub odczytują plik, lub miksuje programy, które wyprowadzają tylko standardowe wyjście / plik z jednym, który obsługuje tylko drugi.
źródło
/tmp/p1
i/tmp/p2
są twoimi potokami wejściowymi, podczas gdy/tmp/output
jest wyjściem.źródło
()
nie wyświetlają danych wyjściowych w każdym wierszu (i innych niejasnych regułach POSIX dotyczących atomowości), możesz skończyć z dziwnym mieszaniem danych wejściowych do cat ...Stworzyłem do tego specjalny program: fdlinecombine
Odczytuje wiele potoków (zwykle dane wyjściowe programu) i zapisuje je na linii prostej (można również przesłonić separator)
źródło
Naprawdę fajnym poleceniem, którego użyłem do tego
tpipe
, może być konieczność skompilowania, ponieważ nie jest to tak częste. Jest naprawdę świetny do robienia dokładnie tego, o czym mówisz, i jest tak czysty, że zwykle go instaluję. Strona podręcznika znajduje się tutaj http://linux.die.net/man/1/tpipe . Aktualnie wymienione pobieranie znajduje się w tym archiwum http://www.eurogaran.com/downloads/tpipe/ .Jest używany w ten sposób,
źródło
Uważaj tutaj; po prostu ich catting skończy się mieszaniem wyników w sposób, którego możesz nie chcieć: na przykład, jeśli są to pliki dziennika, prawdopodobnie tak naprawdę nie chcesz linii od jednej wstawionej w połowie linii od drugiej. Jeśli to w porządku, to
będzie działać. Jeśli to nie jest w porządku, musisz znaleźć coś, co spowoduje buforowanie linii i wyświetli tylko pełne linie. Syslog to robi, ale nie jestem pewien, co jeszcze może być.
EDYCJA: optymalizacja dla niebuforowanego odczytu i nazwanych potoków:
uznanie / tmp / p1, / tmp / p2, / tmp / p3 za nazwane potoki, utworzone przez „mkfifo / tmp / p N ”
teraz w ten sposób możemy odczytać wyjście o nazwie potok „/ tmp / p3” niebuforowane przez:
jest mały rodzaj błędu, musisz „zainicjować” 1. wejściowy potok / tmp / p1 przez:
aby ogon zaakceptował najpierw dane z 2. rury / tmp / p2 i nie czekał, aż coś dojdzie do / tmp / p1. może nie być tak, jeśli jesteś pewien, że / tmp / p1 otrzyma dane wejściowe jako pierwsze.
Potrzebna jest również opcja -q, aby tail nie drukował śmieci o nazwach plików.
źródło
tail -q -f /tmp/p1 /tmp/p2 | awk '{print $0 > "/tmp/p3"; close("/tmp/p3"); fflush();}' &
teraz / tmp / p3 można nawet nazwać potokiem i możesz go odczytać po prostutail -f /tmp/p3
wszystko to jest NIEBUDOWANE = linia po linii jest jednak niewielki rodzaj błędu. pierwszy plik / nazwany potok musi zostać zainicjowany jako pierwszy, aby ogon zaakceptował wyjście z drugiego. więc będziesz musiałecho -n > /tmp/p1
i wszystko będzie działać płynnie.Najlepszym programem do tego jest
lmerge
. W przeciwieństwie do odpowiedzi Freiharta jest zorientowana liniowo, więc dane wyjściowe dwóch poleceń nie będą się wzajemnie blokować. W przeciwieństwie do innych rozwiązań sprawiedliwie łączy dane wejściowe, więc żadne polecenie nie może zdominować wyniku. Na przykład:Daje wynik:
źródło