Vraag piping in real time


Dit is meer een conceptueel iets dan een huidig ​​probleem.

Zou het mogelijk zijn om dit te doen:

tail -f <file> | grep "string" | sed 's/stuff//g' >> output.txt

Het probleem dat ik denk is dat tail -f wordt nooit beëindigd, zodat het niet verder gaat in de opdracht. Ik probeer een bestand in realtime te lezen en uit te voeren. Als dit niet werkt, hoe zou ik het dan doen?


1
2017-12-16 20:41


oorsprong


Ja het werkt. Ik heb het persoonlijk gedaan iets vergelijkbaars met Netcat. - Mitch
Heb je het geprobeerd? Het zou zonder problemen moeten werken. Hoewel staart nooit eindigt, denk ik dat het de uitvoer niet buffert, dus grep kan het onmiddellijk consumeren. Dit kan specifiek zijn voor GNU staart - glenn jackman
Ik heb het geprobeerd en het werkt, ik had niet gedacht dat ik het vandaag zou kunnen testen, maar mijn baas gaf me toegang tot de server - Roboman1723


antwoorden:


De meeste opdrachten die gegevens uitvoeren op stdout, (inclusief grep en sed,) buffer hun uitvoer wanneer het niet naar een terminal gaat. Dat wil zeggen, ze wachten op een groot deel van de output om te verzamelen (zoals 4 KBB) eerder blozen het stuk naar het bestand of de pijp. Dit is over het algemeen efficiënter. Met sommige opdrachten kunt u dit overschrijven, zoals GNU grep welke een heeft --line-buffered optie en GNU sed heeft een --unbuffered keuze. Voor opdrachten die geen manier hebben om de buffering te overschrijven, kunt u tools gebruiken zoals unbuffer of stdbuf.

In dit geval zou ik echter overwegen om GNU te gebruiken awk in plaats daarvan, waar je het doorspoelen van stdout zelf kunt regelen (met de fflush-functie).

tail -f file | gawk '/string/{ gsub(/stuff/, "") } { print; fflush() }' > output.txt

Zien BashFAQ # 9 voor meer informatie over buffering.


2
2017-12-17 10:16



Werkt goed! Veel dank. Was niet zeker of ik het moest gebruiken buffer optie bij elke opdracht. - Roboman1723