我正在创建一个简单的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脚本有什么问题?有没有更有效的方法呢?
答案 0 :(得分:2)
首先,当你说“将目录更改为node0然后grep”时,你没有改变dirs,你只是使用不同的路径。你真的想改变目录吗?是“$ dir / node0 /”还是在“$ dir”目录之外?
第二,/ var / opt / database / 1227-1239 /有空格的文件吗? 你能展示ls的输出吗?
我不会在$(ls)中使用'for dir;做“
时,你会遇到很多陷阱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 .