将文件修改日期和 "grep" 结果通过 "find" 组合在一行中

Combine file modified date and "grep" results through "find", in one line

我们希望在通过 find 命令将 grep 应用于所选文件时显示每个文件的修改日期和时间。最终结果应如下所示:

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

您可以使用此 find+grep 组合来获得格式化结果:

while IFS=$'' 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%p[=10=]')
  • 请注意使用 </code> 作为字段分隔符来解决 filenames/paths 和 whitespaces/newlines 等 </li> <li><code>[=14=] (NULL) 出于同样的原因被用作行终止符。
  • %.2TS用于跳闸第二个值的小数部分。
  • sed 用于在 grep 输出的行首插入 date/time。

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%p[=11=]' |
while IFS=$'' read -r -d '' t f; do grep -HTni 'σχόλια' "$f" | sed "s/^/$t /"; done
EOF;

// var_dump( $cmd );

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