如何让这个脚本只在第一行 grep

How to make this script grep only the 1st line

for i in USER; do
    find /home/$i/public_html/ -type f -iname '*.php' \
    | xargs grep -A1 -l 'GLOBALS\|preg_replace\|array_diff_ukey\|gzuncompress\|gzinflate\|post_var\|sF=\|qV=\|_REQUEST'
done

它忽略了-A1。最终结果是我只希望它向我显示包含任何匹配单词但仅在脚本第一行的文件。如果有更好、更高效、资源密集度更低的方式,那将是很棒的,而且这将是 运行 在非常大的共享服务器上。

for j in (find /home/$i/public_html/ -type f -iname '*.php'); 
    do result=$(head -1l $j| grep $stuff ); 
    [[ x$result |= x ]] && echo  "$j: $result"; 
done

您需要付出更多的努力才能跳过租用空白行。 Fgrep 将节省资源。 一点点 perl 会带来很大的改进,但很难在 phone.

上键入它

编辑: 在不那么局促的键盘上,插入不那么简短的解决方案。

以下代码未经测试:

for i in USER; do
    find /home/$i/public_html/ -type f -iname '*.php' | while read -r; do
        head -n1 "$REPLY" | grep -q 'GLOBALS\|preg_replace\|array_diff_ukey\|gzuncompress\|gzinflate\|post_var\|sF=\|qV=\|_REQUEST' \
            && echo "$REPLY"
    done
done

想法是遍历每个 find 结果,显式测试第一行,如果找到匹配则打印文件名。我不喜欢它,因为它感觉很笨重。

改用awk

for i in USER; do
    find /home/$i/public_html/ -type f -iname '*.php' -exec \
     awk 'FNR == 1 && /GLOBALS|preg_replace|array_diff_ukey|gzuncompress|gzinflate|post_var|sF=|qV=|_REQUEST/
          { print FILENAME }' {} +
done

如果第一行匹配,这将打印当前输入文件。这并不理想,因为它会读取每个文件的所有内容。如果你的awk版本支持,你可以使用

awk '/GLOBALS|.../ { print FILENAME } {nextfile}'

nextfile 命令将在第一行执行,在 awk 测试它是否与正则表达式匹配后有效地跳过文件的其余部分。