Подтвердить что ты не робот

Как выполнить команду grep и выполнить команду (для каждого соответствия)

Как выполнить grep в одном файле и выполнить для каждого соответствия команду?

Файл:

foo
bar
42
foo
bar

Я хочу выполнить для выполнения, например, date для каждого соответствия на foo.

Следующая попытка не работает:

grep file foo | date %s.%N

Как это сделать?

4b9b3361

Ответ 1

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

Более читаемо в script:

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

Для каждой строки ввода read значение будет помещено в переменную $line, а оператор while выполнит тело цикла между do и done. Поскольку значение теперь находится в переменной, а не stdin, я использовал echo, чтобы вернуть его обратно в stdin, но вы могли бы просто сделать date %s.%N "$line", предполагая, что дата работает именно так.

Избегайте использования for line in `grep file foo`, которое похоже, потому что for всегда разбивается на пробелы, и это становится кошмаром для чтения списков файлов:

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

завершится с for.

Ответ 2

Вам действительно нужна команда xargs. http://en.wikipedia.org/wiki/Xargs

grep file foo | xargs date %s.%N

пример соответствия некоторых файлов и преобразования совпадений в полный путь к окну в среде Cygwin

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

Ответ 3

grep command_string file | sh -