2016-10-15 3 views
1

Мы хотим показать дату и время каждого файла, когда вы применяете grep к выбранным файлам командой find. Окончательный результат должен выглядеть следующим образом:Комбинируйте дату изменения файла и результаты «grep» через «find», в одной строке

2016-10-17 Mon 20:38:57 ./rest/47results.php: 5 :σχόλια, ιδέες facebook

Запуска вытекающего из 47test.php файла:

system('export TZ=":Europe/Athens"; find . -name "*.*" \ 
-not \(-path ./admin -prune \) \ 
-not \(-path ./people/languages -prune \) \ 
-not \(-path ./include -prune \) \ 
-type f -mmin -10 \ 
-printf "%TY-%Tm-%Td %Ta %TH:%TM:%TS %p\n" \ 
-exec grep -HTni "σχόλια" {} + '); 

мы получаем различные выведенные для каждого измененного файла и каждую строку :

2016-10-17 Mon 21:09:55.0000000000 ./47test.php 
2016-10-17 Mon 20:40:30.0000000000 ./places/00testout.txt 
2016-10-17 Mon 20:38:57.0000000000 ./rest/47results.php 
./47test.php: 22 :-exec grep -HTni "σχόλια" {} + '); 
./rest/47results.php: 5 :σχόλια, ιδέες facebook 
./rest/47results.php: 6 :σχόλια, ιδέες twitter 
./rest/47results.php: 7 :Τα σχόλια σας 

По одному для каждого find и по одному для каждого результата grep.

Как указано в начале, как можно распечатать отсортированные, комбинированные результаты только по одной строке для каждого grep?

2016-10-17 Mon 21:09:55 ./47test.php 22 :-exec grep -HTni "σχόλια" {} + '); 
2016-10-17 Mon 20:38:57 ./rest/47results.php: 5 :σχόλια, ιδέες facebook 
2016-10-17 Mon 20:38:57 ./rest/47results.php: 6 :σχόλια, ιδέες twitter 
2016-10-17 Mon 20:38:57 ./rest/47results.php: 7 :Τα σχόλια σας 

ответ

2

Вы можете использовать эту find+grep комбинации, чтобы получить форматированный результат:

while IFS=$'\06' read -r -d '' t f; do 
    sed "s/^/$t /" <(grep -HTni 'σχόλια' "$f") 
done < <(find . -type f -mmin -10 -not \(-path ./admin -prune \) \ 
     -not \(-path ./people/languages -prune \) \ 
     -not \(-path ./include -prune \) \ 
     -printf '%TY-%Tm-%Td %Ta %TH:%TM:%.2TS\06%p\0') 
  • Примечания использования \06 в качестве разделителя поле для решения имен файлов/пути с пробельными/переводами строк и т.д.
  • \0 (NULL) используется в качестве ограничителя строки по той же причине.
  • %.2TS Используется для отключения дробной части второго значения.
  • sed Используется для ввода даты/времени при запуске линии grep.

PHP код:

$cmd = <<<'EOF' 
export TZ=":Europe/Athens"; \ 
find . -type f -mmin -10 -not \(-path ./admin -prune \) \ 
     -not \(-path ./people/languages -prune \) \ 
     -not \(-path ./include -prune \) \ 
     -printf '%TY-%Tm-%Td %Ta %TH:%TM:%.2TS\06%p\0' | 
while IFS=$'\06' read -r -d '' t f; do grep -HTni 'σχόλια' "$f" | sed "s/^/$t /"; done 
EOF; 

// var_dump($cmd); 

echo shell_exec($cmd) . "\n"; 
+0

Я прилагается все, что в существующей системе '("......");', но, к сожалению, я получил (вместо результатов) следующее: ** Предупреждение: система(): обнаружен байт NULL. Возможная атака в /home/...../47test.php в строке 28 **. Я поставил что-то не туда? – marikamitsos

+0

ok проверить 'PHP Code' в ответ. – anubhava

+1

Он чувствует себя довольно «интенсивным» для сервера. Я имею в виду, что для распечатки результатов требуется некоторое время (около 10 секунд). Кроме этого. ** Работает как шарм **. Даже в моих самых смелых мечтах. Огромное спасибо. – marikamitsos