Combine la fecha de modificación del archivo y los resultados de "grep" mediante "buscar", en una línea

Resuelto marikamitsos asked hace 8 años • 1 respuestas

Queremos mostrar la fecha y hora de modificación de cada archivo cuando se aplica grepa los archivos seleccionados mediante el findcomando. El resultado final debería verse así:

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

Ejecutando lo siguiente desde el archivo 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 "σχόλια" {} + ');

obtenemos líneas distintas impresas para cada archivo modificado y cada línea :

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  :Τα σχόλια σας

Uno para cada uno findy uno para cada grepresultado.

Como se mencionó al principio, ¿cómo se pueden imprimir resultados ordenados y combinados en una sola línea para cada unogrep ?

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  :Τα σχόλια σας
marikamitsos avatar Oct 15 '16 07:10 marikamitsos
Aceptado

Puede utilizar esta find+grepcombinación para obtener el resultado formateado:

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')
  • Tenga en cuenta el uso de \06como delimitador de campo para abordar nombres de archivos/rutas con espacios en blanco/nuevas líneas, etc.
  • \0(NULL) se utiliza como terminador de línea por el mismo motivo.
  • %.2TSse utiliza para disparar una parte fraccionaria del segundo valor.
  • sedse utiliza para insertar fecha/hora al inicio de la línea de grepsalida.

Código 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";
anubhava avatar Oct 20 '2016 18:10 anubhava