【问题标题】:How to make this script grep only the 1st line如何使此脚本仅 grep 第一行
【发布时间】:2015-10-02 23:36:09
【问题描述】:
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。最终结果是我只希望它向我显示包含任何匹配单词但仅在脚本的第一行的文件。如果有更好、更高效、资源消耗更少的方式,那就太好了,而且这将在非常大的共享服务器上运行。

【问题讨论】:

标签: bash grep xargs


【解决方案1】:

改用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 测试它是否与正则表达式匹配之后有效地跳过文件的其余部分。

【讨论】:

    【解决方案2】:

    以下代码未经测试:

    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 结果,显式测试第一行,如果找到匹配项则打印文件名。不过我不喜欢它,因为它感觉很笨重。

    【讨论】:

      【解决方案3】:
      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 会带来很大的改进,但在手机上很难输入。

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

      【讨论】:

      • 如何将head 添加到上面的find/xargs 管道中?以及如何保留grep -l 的文件名?
      • 是的,我不确定:codefor i in USER;确实找到 /home/$i/public_html/ -type f -iname '*.php' | xargs 头 -1l |grep -B1 'sF=\|qV=' ;完成code
      猜你喜欢
      • 2016-01-26
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2015-01-06
      • 2012-06-27
      • 2013-07-22
      相关资源
      最近更新 更多