GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu spojit dvě pojmenované roury do jednoho vstupního proudu v linuxu

Řešení 1:

Osobně můj oblíbený (vyžaduje bash a další věci, které jsou standardní u většiny distribucí Linuxu)

Podrobnosti mohou hodně záviset na tom, co tyto dvě věci vydávají a jak je chcete sloučit ...

Obsah příkazů command1 a command2 po sobě ve výstupu:

cat <(command1) <(command2) > outputfile

Nebo pokud oba příkazy vypisují alternativní verze stejných dat, která chcete vidět vedle sebe (použil jsem to se snmpwalk; čísla na jedné straně a názvy MIB na druhé):

paste <(command1) <(command2) > outputfile

Nebo pokud chcete porovnat výstup dvou podobných příkazů (řekněme hledání ve dvou různých adresářích)

diff <(command1) <(command2) > outputfile

Nebo pokud se jedná o uspořádané výstupy nějakého druhu, sloučte je:

sort -m <(command1) <(command2) > outputfile

Nebo spusťte oba příkazy najednou (i když by to mohlo trochu zamotat):

cat <(command1 & command2) > outputfile

Operátor <() nastaví pojmenovanou rouru (nebo /dev/fd) pro každý příkaz, převede výstup tohoto příkazu do pojmenované roury (nebo /dev/fd reference filehandle) a předá název na příkazovém řádku. Existuje ekvivalent s>(). Můžete udělat:command0 | tee >(command1) >(command2) >(command3) | command4 například současně odeslat výstup jednoho příkazu 4 dalším příkazům.

Řešení 2:

Pomocí cat můžete připojit dva páry k druhému , jak ukazuje gorila.

Můžete také vytvořit FIFO, nasměrovat na něj výstup příkazů a poté z FIFO číst pomocí jakéhokoli jiného programu:

mkfifo ~/my_fifo
command1 > ~/my_fifo &
command2 > ~/my_fifo &
command3 < ~/my_fifo

Obzvláště užitečné pro programy, které budou pouze zapisovat nebo číst soubor, nebo směšování programů, které vydávají pouze stdout/soubor, s jedním, který podporuje pouze druhý.

Řešení 3:

(tail -f /tmp/p1 & tail -f /tmp/p2 ) | cat > /tmp/output

/tmp/p1 a /tmp/p2 jsou vaše vstupní kanály, zatímco /tmp/output je výstup.

Řešení 4:

Vytvořil jsem pro to speciální program:fdlinecombine

Čte více rour (obvykle výstupy programu) a zapisuje je do stdout po řádcích (můžete také přepsat oddělovač)

Řešení 5:

Zde buďte opatrní; Pouhým jejich zachycováním skončíte smícháním výsledků způsobem, který možná nechcete:například pokud jsou to soubory protokolu, pravděpodobně nebudete chtít, aby byl řádek z jednoho vložen do poloviny řádku z druhého. Pokud je to v pořádku, pak

tail -f /tmp/p1 /tmp/p2>/tmp/output

bude pracovat. Pokud není dobře, pak budete muset najít něco, co bude provádět ukládání do vyrovnávací paměti řádku a vypíše pouze úplné řádky. Syslog to dělá, ale nejsem si jistý, co jiného by mohlo.

EDIT:optimalizace pro čtení bez vyrovnávací paměti a pojmenované kanály:

považovat /tmp/p1 , /tmp/p2 , /tmp/p3 za pojmenované kanály, vytvořené "mkfifo /tmp/pN "

."

ocas -q -f /tmp/p1 /tmp/p2 | awk '{print $0> "/tmp/p3"; close("/tmp/p3"); fflush();}' &

nyní tímto způsobem můžeme číst výstup s názvem roura "/tmp/p3" unbuffered od :

tail -f /tmp/p3

existuje malá chyba druhu, musíte "inicializovat" 1. vstupní potrubí /tmp/p1 pomocí:

echo -n> /tmp/p1

za účelem ocasu nejprve přijme vstup z 2. roury /tmp/p2 a nebude čekat, až něco přijde do /tmp/p1 . to nemusí být tento případ, pokud jste si jisti, /tmp/p1 obdrží vstup jako první.

Pro ocas je potřeba také volba -q netiskne nesmysly o názvech souborů.


Linux
  1. Jak obnovit smazaný adresář /tmp v Linuxu

  2. Jak používat Pipes a Named Pipes v Linuxu (s příklady)

  3. Jak spojit dva textové soubory v Linuxu

  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Linux – propojení /proc/mnt s /proc/mounts?

  3. Linux – sloučení /usr/bin A /usr/sbin do /bin (gnu/linux)?

  1. Jak přenosné jsou /dev/stdin, /dev/stdout a /dev/stderr?

  2. Jak systemd-tmpfiles vyčistí /tmp/ nebo /var/tmp (náhrada tmpwatch) v CentOS / RHEL 7

  3. UNIX / Linux :Jaká je správná oprávnění adresářů /tmp a /var/tmp