递归地从目录中的某些文件grep数据并将值返回到file

时间:2012-09-28 02:40:04

标签: shell ubuntu

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

#!/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

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

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

3 个答案:

答案 0 :(得分:2)

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

第二,/ var / opt / database / 1227-1239 /有空格的文件吗? 你能展示ls的输出吗?

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

当你attempt to parse 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)有一些文件包含坏字符或空格,所以当你手动处理文件时一切正常,因为你正在逃避这些字符?

答案 1 :(得分:0)

为什么不使用

之类的东西
find . -name "*" -print | xargs grep -i <text>

在当前目录

下的所有文件中搜索text

答案 2 :(得分:0)

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

grep <text> -R .