bash脚本在特定文件夹的xml文件中查找/ grep特定字符串

时间:2014-06-03 10:04:53

标签: xml perl bash unix

我在工作中遇到问题,我需要简化我如何保持日志的过程。我想请求专家的帮助。

我们为每个频道提供不同的服务。结构如下:

- 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?

任何帮助将不胜感激

感谢

2 个答案:

答案 0 :(得分:2)

使用find -path,如下所示:

find . -path "./root/${channel_name}/service*/${date}/*.xml" -type f -exec grep "${pattern}" {} \;

channel_namedate分别是包含频道名称(例如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打印文件中的行号..

如果你输入一个脚本,你可以在需要的地方添加变量。