递归查找所有不以评论开头的php文件

时间:2016-07-20 21:16:50

标签: linux bash shell grep

是否有任何有用的命令组合(sed / grep / find等)我可以用来检测不以注释开头的.php文件?我当然可以编写一个小脚本,但我宁愿使用shell命令。

匹配模式:

<?php
/*

我想搜索文件的内容,而不是文件名。

我必须处理一个黑客网站,其中代码注入遵循某种模式。

<?php $code....
/*

<?php
$code....
/*

5 个答案:

答案 0 :(得分:3)

使用gnu grep您可以使用此递归搜索:

grep -rvlz $'^[[:space:]]*<?php\n/\*' --include='*.php'

答案 1 :(得分:1)

这将检测所有以php标签开头的php文件;

find ./ -iname '*.php' | xargs head -v -n 1 | grep -B 1 '<?php'
  • 查找所有带有php扩展名的文件。
  • 前往第一行并包含文件名。
  • grep此输出以查找以php标记开头的任何文件。
  • -B 1:在比赛前保留1行,以便我们获取文件名。

这很快,很脏,你可以想象输出更好或使其更强大。

答案 2 :(得分:0)

从shell中你可以使用这个小awk脚本来查看文件是否以评论开始

awk 'NR==2 && f$0!="<?php/*"{print FILENAME}NR>2{exit 1}{f=$0}' file.php

要将脚本递归地应用于目录,请使用:

find -name '*.php' \
  -exec awk 'NR==2 && f$0!="<?php/*"{print FILENAME}NR>2{exit 1}{f=$0}' {} \;

可能的空格是对上述解决方案的限制,但在与<php?/*进行比较之前,可以通过删除所有可能的空格轻松地对其进行调整

答案 3 :(得分:0)

{ "type": "MultiLineString", "coordinates": [ [ [ -105.0214433670044, 39.57805759162015 ], [ -105.02150774002075, 39.57780951131517 ], [ -105.02157211303711, 39.57749527498758 ], [ -105.02157211303711, 39.57716449836683 ], [ -105.02157211303711, 39.57703218727656 ], [ -105.02152919769287, 39.57678410330158 ] ], [ [ -105.01989841461182, 39.574997872470774 ], [ -105.01959800720215, 39.57489863607502 ], [ -105.01906156539916, 39.57478286010041 ] ], [ [ -105.01717329025269, 39.5744024519653 ], [ -105.01698017120361, 39.574385912433804 ], [ -105.0166368484497, 39.574385912433804 ], [ -105.01650810241699, 39.5744024519653 ], [ -105.0159502029419, 39.574270135602866 ] ], [ [ -105.0142765045166, 39.57397242286402 ], [ -105.01412630081175, 39.57403858136094 ], [ -105.0138258934021, 39.57417089816531 ], [ -105.01331090927124, 39.57445207053608 ] ] ] } 是你的朋友:

awk

备注

  1. find /your/path/here -type f -iname "*.php" -exec \ awk 'FNR==2{if($0~/^\/\*/){print FILENAME};exit}' {} \; {}传递给awk的参数。
  2. awk builtin find包含正在处理的当前文件
  3. FILENAME在第二行的开头搜索$0~/^\/\*/
  4. /*看起来选择要处理的记录号,FNR==2用于在处理所需记录后退出awk。

答案 4 :(得分:0)

用于查找文件的UNIX工具名称恰当find,UNIX工具对通用文本操作的操作是awk

find . -name '*.php' -print |
xargs awk -v RS='^$' 'index($0,"<?php\n/*")==1{print FILENAME}'

以上使用GNU awk进行多字符RS。我们使用index()来强制执行字符串而不是regexp搜索,因为您的目标字符串包含多个正则表达式元字符,因此这可以节省我们将它们全部转义。