2015-08-05 1 views
3

J'utilise la commande suivante pour voir quels VirtualHosts obtiennent du trafic sur mon serveur (les alternatives sont les bienvenues). Je veux être capable d'analyser le nombre de résultats dans un intervalle de temps tout en voyant ce qui se passe. Pour ce faire, j'ai essayé d'écrire la sortie dans un fichier tout en l'affichant en utilisant tee.Le Té n'écrit pas sur l'écran ou le fichier

ngrep 'Host:' port 80 -t -W byline -q | grep '^Host' | tee ~/hosts.log 

Cependant, rien n'est imprimé à l'écran ou consigné dans un fichier.

J'ai essayé différents emplacements de fichiers, en dehors de ma session screen - sans différence. Est-ce que grep nécessite une manipulation spéciale?

+1

Vérifiez quel 'tee' vous utilisez avec quel tee. Assurez-vous que c'est en fait la commande 'tee' et pas autre chose. –

+0

duplication possible de [Force ligne-tampon de stdout lors de la tuyauterie à tee] (http://stackoverflow.com/questions/11337041/force-line-buffering-of-stdout-when-piping-to-tee) –

Répondre

4

La mémoire tampon de ligne est en cours de lecture de la part de ngrep et de grep. Voici comment vous pouvez obtenir problème aroundthe vous voyez:

% sudo ngrep 'Host:' port 80 -t -W byline -d lo -q -l |grep --line-buffered '^Host:' |tee foo.log 

Notez que ngrep est d'utiliser -l pour faire la ligne stdout tamponne et grep utilise --line-buffered pour la même.

(j'ai ajouté le -d lo juste pour mes propres tests.)

3

Vous pouvez utiliser la commande stdbuf, comme ceci:

ngrep 'Host:' port 80 -t -W byline -q | stdbuf -o0 grep '^Host' | tee /tmp/hosts 

J'installe le tampon stdout de grep à zéro.

stdbuf est un marteau général qui fonctionne pour les programmes qui sont liés par rapport à glibc car la bufferisation de sortie/entrée se produit dans la libc. La sortie d'un programme qui écrit dans un terminal obtiendra une ligne tamponnée, la sortie d'un programme qui est envoyé à un canal ou à un fichier sera mise en mémoire tampon, sauf si le programme appelle lui-même flush(). Vous pouvez utiliser stdbuf pour modifier ce comportement.

Btw, semblent ngrep et tee appeler flush() (ngrep sur stdout, tee sur stdin) puisque nous ne l'avons pas eu besoin d'utiliser stdbuf pour eux.


J'accepte MicahElliot's answer depuis --line-buffered est plus spécifique pour grep et doit être utilisé ici. stdbuf est une bonne alternative pour les programmes qui n'offrent pas une telle option (et pour les gars comme moi qui n'ont pas lu la page man de grep avant);)

+0

Merci pour recommandant lequel accepter :) J'ai utilisé le vôtre parce que je suis fainéant et c'était moins tapant; Je dois aller lire les pages man pour la réponse de @Micah Elliott pour comprendre les drapeaux! – PeterB

+0

Hehe! Vous êtes les bienvenus :) – hek2mgl

+1

@PeterB Btw, MERCI de me montrer ce bel outil !! Je ne connaissais pas 'ngrep' avant. Cool! Une petite recherche m'a aussi donné 'netsed' - ce qui semble aussi prometteur! – hek2mgl