BASH命令 - 在DO - DONE中使用IF - FI

时间:2015-02-24 14:39:41

标签: bash command

我试图运行一个命令,找到包含" 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'

请帮助:)

4 个答案:

答案 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