2012-03-23 16 views

risposta

4

Se stai reindirizzando l'output di sed o awk in un file (invece di modificare i file sul posto) si può dare pv ("spettatore pipe") un colpo:

sed -e '...' input.txt | pv > output.txt 

È possibile utilizzare pv -l per farlo riportare l'avanzamento nelle righe scritte. Lo stato di avanzamento viene stampato su stderr mentre i dati effettivi navigano da stdin a stdout.

4

Si può sempre dire awk per stampare il record di input, cioè

awk '{ 
     print "#dbg:$0="$0 
     # do more stuff 
     print $1 
     # or make it conditional 
     if ($0 ~ /specialRegEx/){ 
       print "#dbg:$0="$0 
     } 
     }' infile 

Con sed, si utilizza la 'p' cmd per stampare ogni linea, anche se, il valore predefinito è quello di stampare ogni linea. Qualcosa come

sed 'p 
     # also "=" prints line # being processed 
     = 
     /specialRegEx/{ 
     s/xxx/yyy/ 
     p 
     }' infile 

Spero che questo aiuti.

5

Questo potrebbe funzionare per voi (per sed):

sed -i 's/foo/bar/;w /dev/stdout' files* 
+0

Per me il comando -i nel comando originale non funziona su OS X. Manca -e? – Paul

+0

Commento di Paul: esempio pratico utilizzando sed per OS X: '$ echo Ciao> prova $ sed -e 's/ll/ZZ /; w/dev/stdout' -i .backup prova hezzo $ cat test hezzo $ cat test.backup ciao' – StuartLC

+1

Paul: Mac OS X utilizza la versione BSD di sed, che funziona in qualche modo in modo diverso rispetto alla versione GNU che si trova comunemente sui sistemi Linux. Con BSD sed devi sempre specificare * qualche * estensione per -i, mentre GNU sed non interpreta nulla come una stringa vuota. Quindi l'equivalente di BSD sed di 'sed -i' di GNU è semplicemente' sed -i ''. Gli esempi di StuartLC funzionano allo stesso modo su entrambe le versioni perché non sta modificando i file sul posto (ad esempio, sta utilizzando estensioni non a lunghezza zero, quindi non si imbatte in questa piccola differenza). – robo

3

Se siete su Linux, è possibile visualizzare l'avanzamento del processo che sta elaborando un file di grandi dimensioni, cercando in /proc/<pid>/fdinfo. C'è una voce per ogni descrittore di file aperto, e se si catcha le voci, esse mostrano la posizione di lettura/scrittura del descrittore di file. Quindi puoi vedere che sei 1123456 byte nel file. I nomi dei percorsi dei file aperti si trovano in un'altra area: /proc/<pid>/fd, rappresentati come collegamenti simbolici.

Prima di dare un'occhiata, di solito allego un strace al processo: strace -p <pid>. È possibile utilizzarlo per osservare le chiamate di sistema eseguite dal processo: letture e scritture di file e allocazioni di memoria con brk o mmap.

+0

Per comodità: 'ps ax | grep foo' dove 'foo' è il nome del programma in questione può essere usato per trovare l'id di processo per l'uso sopra. –

5

Partendo dal presupposto che si sta eseguendo il piping dell'output di sed su un file, è possibile utilizzare il comando tail (in un altro terminale) per esaminare costantemente la fine del file; in modo tale da poter vedere i progressi.

tail -f output_from_sed.txt 
2

Questo potrebbe non essere esattamente quello che stai cercando, ma potrebbe aiutare qualcun altro. FWIW:
gawk -W dump-variables=/tmp/awk.log
eseguirà il dump dei valori delle variabili alla fine dello script nel file di registro.

7

Questo è basato sulla risposta di Potong. Il seguente codice sostituisce "ll" con "zz", crea un file di backup, visualizza il nuovo testo e scrive le modifiche nel file.

$ echo hello > test 
$ sed -e 's/ll/zz/;w /dev/stdout' -i .backup test 
hezzo 
$ cat test 
hezzo 
$ cat test.backup 
hello 
+2

Nelle versioni sed più recenti, se il punto e virgola prima di w viene omesso, w diventa un argomento del comando "s" sed e solo le modifiche vengono scritte in/dev/stdout, che per me è più utile della scrittura dell'intero file – Jack

0

Il "diritto" risposta qui è

pv myfile.txt | sed ... 

risposta di Eduardo Ivanec era vicino, ma utilizzando lo spettatore tubo (pv) per fare le tubazioni vero e proprio, si arriva a sapere che cosa il vostro progresso è nel file (come percentuale, includendo fantastiche statistiche come M/sec, dati totali, ecc.).

pv opere come cat (leggere il file ed esportarlo direttamente a stdout, o, nel caso di tubazioni in, è un ponte tra stdin e stdout).

Importante, dal momento che pv è un "processo di tubo trasparente", lo stdout è occupato con i dati di inoltro. Quindi il report sull'avanzamento viene segnalato tramite stderr.

+0

Nota che questo non funziona con le sostituzioni sul posto ... (AFAIK) – starryknight64

Problemi correlati