用于从目录中的某些文件中递归地 grep 数据的脚本

用于从目录中的某些文件中递归地 grep 数据的脚本

我正在编写一个简单的 shell 脚本,它将最大限度地减少我搜索父目录下的所有目录并在某些文件中 grep 某些内容所花费的时间。这是我的脚本。

#!/bin/sh
MainDir=/var/opt/database/1227-1239/

cd "$MainDir"

for dir in $(ls); do

grep -i "STAGE,te_start_seq Starting" "$dir"/his_file | tail -1 >> /home/xtee/sst-logs.out

if [ -f "$dir"/sysconfig.out];
then
    grep -A 1 "Drive Model" "$dir"/sysconfig.out | tail -1 >> /home/xtee/sst-logs.out
else
    grep -m 1 "Physical memory size" "$dir"/node0/setupsys.out | tail -1 >> /home/xtee/sst-logs.out
fi

done

该脚本应该STAGE,te_start_seq Starting在文件下grep 字符串his_file,然后将其转储sst-logs.out。但我的问题是语句中的部分if。脚本应该检查当前目录,如果存在,则sysconfig.outgrepdrive model并将其转储到,否则,将目录更改为,然后 grep从转储到。我的问题是,该语句似乎不起作用,因为它根本不转储任何数据,但如果我手动执行 grep,我确实有数据。sst-logs.outnode0physical memory sizesetupsys.outsst-logs.outif then else

我的 shell 脚本有什么问题?有没有更有效的方法?

答案1

至少有一个语法错误;您在]if 语句之前缺少一个空格。该行应该是

if [ -f "$dir"/sysconfig.out ] ;

奇怪的是您的脚本没有报告这一点。您是从 cron 运行的吗?在自动启动脚本之前,请先确保它正常工作。添加echo语句来调试您的程序:

if [ -f "$dir/sysconfig.out" ] ; then
  echo "$dir/sysconfig.out present"
  echo running grep -A 1 "Drive Model" "$dir"/sysconfig.out
  grep -A 1 "Drive Model" "$dir"/sysconfig.out | tail -1 >> /home/xtee/sst-logs.out
else
  echo "$dir/sysconfig.out absent"
  echo running rep -m 1 "Physical memory size" "$dir"/node0/setupsys.out
  grep -m 1 "Physical memory size" "$dir"/node0/setupsys.out | tail -1 >> /home/xtee/sst-logs.out
fi

相关内容