I programmi sed
e awk
di solito svolgono il loro lavoro in silenzio. C'è un modo per ottenere questi programmi per dichiarare quello che stanno facendo?Stampa di progresso dettagliato da sed e awk
risposta
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
.
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.
Questo potrebbe funzionare per voi (per sed):
sed -i 's/foo/bar/;w /dev/stdout' files*
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
.
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. –
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
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.
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
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
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
.
Nota che questo non funziona con le sostituzioni sul posto ... (AFAIK) – starryknight64
- 1. Sed e Awk in uscita e commerciale (&)
- 2. differenze tra grep, awk e sed
- 3. sed/awk in maiuscolo stringhe
- 4. Conversione FASTQ per FASTA con SED/AWK
- 5. Trova e sostituisci per JSON con sed o awk
- 6. elimina una colonna con awk o sed
- 7. Qual è la differenza tra sed e awk?
- 8. sed: stampa solo gruppo corrispondente
- 9. Stampa tutti i campi con AWK separati da OFS
- 10. Unione di due linee consecutive utilizzando awk o sed
- 11. Come posso mostrare prolissi py.test diff senza progresso di test dettagliato?
- 12. Perché awk non stampa le nuove righe?
- 13. Stampa RegEx corrisponde a SED in bash
- 14. Come modificare il separatore decimale con awk/sed?
- 15. Python o awk/sed per la pulizia dei dati
- 16. Rimozione di trailing/avvio di newline con sed, awk, tr e friends
- 17. Perché sed non stampa un gruppo opzionale?
- 18. Cosa può awk fare che sed non può?
- 19. Utilizzare sed o awk per fissare il formato data
- 20. Come passare/ruotare ogni due righe con sed/awk?
- 21. Errore più dettagliato da createFileAtPath?
- 22. CMake output dettagliato da prove
- 23. Come eseguire tali sostituzioni con AWK o sed o Perl?
- 24. Estrazione nome di directory da un percorso assoluto utilizzando sed o awk
- 25. Output dettagliato di script
- 26. Abilita output dettagliato da AntBuilder di groovy
- 27. Passaggio di variabili in awk da bash
- 28. Confronto dettagliato di ICEfaces e RichFaces?
- 29. Stampa solo la prima parola di ogni paragrafo utilizzando sed
- 30. Come sostituire l'ennesima colonna/campo in una stringa separata da virgola usando sed/awk?
Per me il comando -i nel comando originale non funziona su OS X. Manca -e? – Paul
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
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