0

我正在制作一个简单的 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.out,grepdrive model并将其转储到(sst-logs.out如果存在),否则,将目录更改为node0然后 grep physical memory sizefromsetupsys.out并将其转储到sst-logs.out. 我的问题是,该if then else语句似乎不起作用,因为它根本不转储任何数据,但如果我手动执行 grep,我确实有数据。

我的 shell 脚本有什么问题?有没有更有效的方法来做到这一点?

4

3 回答 3

2

首先,当您说“将目录更改为 node0 然后 grep”时,您并没有在这里更改目录,您只是在使用不同的路径。您真的要更改目录吗?是“$dir/node0/”还是在“$dir”目录之外?

其次,/var/opt/database/1227-1239/ 有没有带空格的文件?你能显示ls的输出吗?

我不会在 $(ls); 中使用 'for dir 做'

当您尝试解析 ls时,您将开始遇到很多陷阱

for dir in * ; do 
 if [[ -d "$dir" ]] ; then
  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
 if
done

如果你得到它,你也可以使用 find -maxdepth ,否则它会变成 .. -prune -o ..

我唯一的猜测是 $(ls) 有一些带有错误字符或空格的文件,所以当您手动处理这些文件时,一切正常,因为您正在转义这些字符?

于 2012-09-28T03:25:57.007 回答
0

你为什么不使用类似的东西

find . -name "*" -print | xargs grep -i <text>

搜索text当前目录下的所有文件

于 2012-09-28T03:09:37.553 回答
0

你听说过 grep 的递归选项吗?

grep <text> -R .
于 2012-09-28T03:18:17.253 回答