我在工作中遇到问题,我需要简化我如何保持日志的过程。我想请求专家的帮助。
我们为每个频道提供不同的服务。结构如下:
- root/channel_1/service_1/2014-05-21/file_54544654541.xml
- root/channel_1/server2_2/2014-05-20/file_74272172.xml
- root/channel_1/service_3/2014-05-22/file_45456546.xml
- root/channel_2/service_4/2014-05-23/file_78754456.xml
- root/channel_2/service_5/2014-05-24/file_546546546.xml
我的主要问题是在这些xml文件中找到特定的字符串。可以说,我知道频道名称,但我不知道我的特定字符串应该存在的服务名称。我也知道约会。
所以在搜索中我想输入频道名称的日期和字符串。搜索将通过所有服务文件夹进行,并仅在特定日期文件夹和特定频道下的所有xml文件中查找字符串。
任何有关实现此目标的最快捷,最简单的解决方案的想法?是通过bash还是perl?
任何帮助将不胜感激
感谢
答案 0 :(得分:2)
使用find -path
,如下所示:
find . -path "./root/${channel_name}/service*/${date}/*.xml" -type f -exec grep "${pattern}" {} \;
channel_name
和date
分别是包含频道名称(例如channel_2
)和日期(例如2014-05-24
)的变量。 service*
搜索所有service
个目录。
答案 1 :(得分:0)
更新(现在应该管理更改目录时的问题):
这是一个如何管理太多文件问题的示例。
如果您在SearchForMe.sh
后保存为chmod u+x SearchForMe.sh
,则可以将其作为
./SearchForMe.sh 555-100006 2014-05-20 /log/root
如果您介意,可以将STDERR
重定向到2>/dev/null
以避免查看错误和/或您可以取消注释exit
命令以使其在出错时停止。
#!/bin/bash
KeyToSearch=${1:-"555-123456"}
SearchDate=${2:-"2014-05-20"}
Starting_Path=${3:-"root"}
# echo "# Key to search $KeyToSearch" 1>&2
# echo "# Date to search $SearchDate" 1>&2
# echo "# Starting Path $Starting_Path" 1>&2
if ( cd $Starting_Path ) ; then cd $Starting_Path
else echo "# Cannot start from the path " $Starting_Path ; exit 3;
fi
for d1 in */ ; do
if ( cd $d1 ) ; then # Nice trick: try to change in a subshell...
cd $d1;
for d2 in */ ; do
if ( cd $d2 ) then
cd "$d2"
if [ -x "${SearchDate}" ]; then
Cpwd=`pwd`
echo "# Searching ${SearchDate} in $Cpwd " 1>&2 # you can comment this line
grep -nH -e $KeyToSearch ${SearchDate}/*.xml | awk -v CDir=$Cpwd '{print CDir"/"$1}'
fi
cd ..
else
echo "Cannot change directory!" "$d1" "$d2" 1>&2 ; # exit 2
fi # Uncomment the previous exit if you want to stop here
done
cd ..
else
echo "Cannot change directory!" "$d1" 1>&2 ; # exit 1
fi # Uncomment the previous exit if you want to stop here
done
此处技巧尝试更改子shell (cd $d1)
中的目录,允许管理某些目录中无权访问的情况。
重定向输出(回答评论):
当您运行程序或脚本时,您始终可以重定向
1> My_Results.txt
2> My_Errors.txt
如果无法在目录中输入或读取文件,您将拥有一个结果文件和一个错误文件...
旧答案(当文件数量不是那么大时) 尝试像
这样的东西grep -E MYPATTERN -n root/channel_*/service_*/2014-05-24/file_*.xml
这取决于您希望在目录结构中找到的内容。
我的意思是如果所有目录都名为service_1 ... service_9而没有service_10,则可以使用service_?
代替service_*
...
-E
将PATTERN解释为扩展正则表达式,并允许您使用很多选择规则
-n
打印文件中的行号..
如果你输入一个脚本,你可以在需要的地方添加变量。