是否有任何有用的命令组合(sed / grep / find等)我可以用来检测不以注释开头的.php文件?我当然可以编写一个小脚本,但我宁愿使用shell命令。
匹配模式:
<?php
/*
我想搜索文件的内容,而不是文件名。
我必须处理一个黑客网站,其中代码注入遵循某种模式。
<?php $code....
/*
或
<?php
$code....
/*
答案 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'
-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
备注强>
find /your/path/here -type f -iname "*.php" -exec \
awk 'FNR==2{if($0~/^\/\*/){print FILENAME};exit}' {} \;
是{}
传递给awk
的参数。find
包含正在处理的当前文件FILENAME
在第二行的开头搜索$0~/^\/\*/
/*
看起来选择要处理的记录号,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搜索,因为您的目标字符串包含多个正则表达式元字符,因此这可以节省我们将它们全部转义。