2012-11-15 12 views

risposta

24
grep file foo | while read line ; do echo "$line" | date %s.%N ; done 

Più essere letti in uno script:

grep file foo | while read line 
do 
    echo "$line" | date %s.%N 
done 

Per ciascuna linea di ingresso, read metterà il valore nella variabile $line, e l'istruzione while eseguirà il corpo del ciclo tra do e done. Poiché il valore è ora in una variabile e non nello stdin, ho utilizzato echo per reinserirlo nello stdin, ma è sufficiente eseguire date %s.%N "$line", presupponendo che la data funzioni in questo modo.

Evitare di utilizzare for line in `grep file foo` che è simile, perché for rompe sempre su spazi e questo diventa un incubo per la lettura di elenchi di file:

find . -iname "*blah*.dat" | while read filename; do .... 

fallirebbe con for.

+0

Nessun problema. Esistono strumenti Unix per la maggior parte delle attività di massa, incluse cose come la capacità di grep di leggere più schemi da un file (-f), o la capacità di xargs di costruire comandi da stdin. –

+0

Se ciò non fosse: grep file foo ------- NOME grep, egrep, fgrep, rgrep - linee di stampa corrispondono ad un modello SINOSSI grep [opzioni] Pattern [FILE .. .] – Xofo

+0

come posso eseguire lo script: file grep foo | mentre leggi la riga do echo "$ line" | data% s.% N completata Devo inserire un file? –

7

Quello che ti serve è un comando xargs. http://en.wikipedia.org/wiki/Xargs

grep file foo | xargs date %s.%N 

esempio di corrispondenza alcuni file e la conversione partite al percorso vetrate in Cygwin ambiente

$ find $(pwd) -type f -exec ls -1 {} \; | grep '\(_en\|_es\|_zh\)\.\(path\)$' | xargs cygpath -w 
0
grep command_string file | sh - 
+0

Ciao @James, benvenuto in SO, è una buona idea aggiungere una spiegazione, che migliorerà la risposta e sarà più probabile che venga svalutato. –

Problemi correlati