2012-11-15 4 views

Odpowiedz

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

Więcej czytelnie w skrypcie:

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

Dla każdej linii wejścia, read wprowadzi wartość do zmiennej $line, oraz oświadczenie while wykona ciało pętli pomiędzy do i done. Ponieważ wartość jest teraz zmienna, a nie stdin, użyłem echo, aby przenieść ją z powrotem do standardowego wejścia, ale można po prostu zrobić date %s.%N "$line", zakładając, że data działa w ten sposób.

Unikaj używania for line in `grep file foo` który jest podobny, ponieważ for zawsze rozkłada się na przestrzeni, a to staje się koszmarem dla odczytu listy plików:

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

zawiedzie z for.

+0

Nie ma problemu. Istnieją narzędzia unixowe do większości zadań masowych, w tym rzeczy takie jak zdolność grep do odczytywania wielu wzorców z pliku (-f) lub zdolność xargs do konstruowania poleceń ze stdin. –

+0

Jeżeli nie będzie to: grep plik foo ------- NAZWA grep, egrep, fgrep, rgrep - wypisywanie linii pasujących do wzorca SKŁADNIA grep [opcje] wzorzec [plik .. .] – Xofo

+0

Jak mogę wykonać skrypt: plik grep foo | podczas czytania linii do echo "$ line" | data% s.% N done Czy muszę wstawić plik? –

7

To, czego naprawdę potrzebujesz, to komenda xargs. http://en.wikipedia.org/wiki/Xargs

grep file foo | xargs date %s.%N 

przykładem dopasowania niektórych plików i konwersja mecze do ścieżki pełne okien w środowisku Cygwin

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

Witaj w @James, witamy w SO, warto dodać wyjaśnienie, które poprawi odpowiedź i będzie bardziej prawdopodobne, że zostanie przegłosowane. –