我试图运行一个命令,找到包含" base64_decode"的PHP文件。和/或" eval",回显文件名,前三行,如果文件包含3行以上,也是底部3行。
我现在有以下内容:
for file in $(find . -name "*.php" -exec grep -il "base64_decode\|eval" {} \;); do echo $file; head -n 3 $file; if [ wc -l < $file -gt 3 ]; then tail -n 3 $file fi; done | less
这会返回以下错误:
bash: syntax error near unexpected token `done'
请帮助:)
答案 0 :(得分:2)
问题似乎在这里:
if [ wc -l < $file -gt 3 ]; then
由于您需要在此处使用命令替换以确保首先执行wc -l
命令,然后比较结果:
if [[ $(wc -l < "$file") -gt 3 ]]; then
答案 1 :(得分:2)
您想要执行wc
,更像是:
if [[ $(wc -l < $file) -gt 3 ]]; then
答案 2 :(得分:2)
我会使用以下
while read -r file
do
echo ==$file==
head -n 3 "$file"
[[ $(grep -c '' "$file") > 3 ]] && (echo ----last-3-lines--- ; tail -n 3 "$file")
done < <(find . -name \*.php -exec grep -il 'base64_decode\|eval' {} \+)
while
上使用for
会更好,因为文件名可能包含空格。 /可能不是在这种情况下,但无论如何:)/ grep -c '' "$file"
有时会更好(当文件中的最后一行不包含\n
字符时(wc
计算文件中的\n
个字符)find
代替\+
的{{1}}效率更高答案 3 :(得分:-1)
试试这个:
#!/bin/bash
for file in $(grep -H "base64_decode\|eval" ./*.php | cut -d: -f1);
do
echo $file;
head -n 3 $file;
if [[ $(wc -l < $file) -gt 3 ]];
then
tail -n 3 $file
fi;
done
我测试过,似乎工作正常。
但是,要小心......如果php有4行,你会看到:
line1
line2
line3
line2
line3
line4
编辑:将上面的脚本更改为grep文件内部。
cat a.php
asdasd
asd
base64_decode
l
a
和结果
./test2.sh
./a.php
asdasd
asd
base64_decode
base64_decode
l
a