Cosa fa il buffering della linea grep?


25

Ecco il mio comando che sto usando in uno script per grepi dati in tempo reale. Non sembra estrarre correttamente i dati in tempo reale poiché manca solo alcune righe.

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

Cosa farebbe il seguente comando? Che cos'è il "buffering di riga"?

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

Risposte:


44

Quando si utilizza in modo non interattivo, la maggior parte dei comandi standard include grep, bufferizza l'output, il che significa che non scrive immediatamente i dati stdout. Raccoglie una grande quantità di dati (dipende dal sistema operativo, in Linux, spesso 4096 byte) prima di scrivere.

Nel tuo comando, grepl'output stdindel sedcomando è reindirizzato al comando, quindi grepbufferizza il suo output.

Quindi, l' --line-bufferedopzione causa l' greputilizzo del buffer di linea, ovvero la scrittura dell'output ogni volta che vede una nuova riga, invece di attendere per impostazione predefinita 4096 byte. Ma in questo caso, non è necessario grepaffatto, basta usare tail+ sed:

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

Con il comando che non ha l'opzione per modificare il buffer, è possibile utilizzare GNU coreutils stdbuf

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

per attivare il buffering di linea o usare -o0per disabilitare il buffer.

Nota

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.