2014-11-14 47 views
0

我正在使用命令来搜索从Unix中给定的目录开始的文件,结尾为* .sas并包含字符串DB2的文件。然后,我想要搜索字符串DSN =或DATASRC =的结果集文件,并打印包含这些字符串的行。所以这是我使用find命令:在Unix中为一个给定的字符串,然后在这个文件中的另一组字符串中搜索文件

find '/shrproj/' -type f -name '*.sas' -exec grep -il 'DB2' {} \; 2> /dev/null | xargs egrep -Ri 'DSN=|DATASRC=' 

这给了我所期望的输出继电器:

/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:     ,"DSN=%UPCASE(&the_database.)" 
/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:     ,"DSN=%UPCASE(&the_database.)" 

但现在我也想打印的文件的属性(使用-ls选项)按照上述结果即下面是我打算实现:

/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:     ,"DSN=%UPCASE(&the_database.)" 
/shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas:     ,"DSN=%UPCASE(&the_database.)" 
61522 19 -rwxrwsr-x 1 sas  sas   18546 Jun 2 2010 /shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas 

在最后一行的文件的属性使用带有-ls选项find命令时,上面是一样的。

find /shrproj/files/stp_code/aea_aat_stp/icrv3/bin/macro/cnct_2_eaw.sas -ls 

那么,如何使用上面使用的第一个Find命令为每个文件实现这个?

请让我知道。谢谢。

+0

不要[双岗问题](http://unix.stackexchange.com/q/168046/60101)! – BroSlow 2014-11-16 13:30:09

回答

0

类似下面应该工作

find /shrproj/ -type f -name '*.sas' \ 
-exec grep -iq 'DB2' {} \; \(\ 
    -exec grep -iq 'DSN=' {} \; -o \ 
    -exec grep -iq 'DATASRC=' {} \; \) \ 
-ls \ 
-exec egrep -i 'DSN=|DATASRC=' {} \; 

具有一定的冗余,因为逻辑-q将退出在第一场比赛(所以不能同时使用与打印所有的结果),但不应该过于缓慢如果你没有很多大型文件,DSN=DATASRC=只能在最后找到。

另外,不滥用grep -q太多

find /shrproj/ -type f -name '*.sas' \ 
-exec grep -iq 'DB2' {} \; \ 
-exec bash -c 'out=$(egrep -i "DSN=|DATASRC=" "$1"); [[ -n $out ]] && echo "$out" && exit 0 || exit 1 ' bash {} \; \ 
-ls 
1

对于这个特定的任务BroSlows解决方案似乎是最好的(虽然不一定是最可读的)。但是如果你将来需要更高级的东西呢?这是GNU Parallel可以帮助您的地方。为每个文件创建一个脚本或bash函数:

grepit() { 
    FILE="$1" 
    grep -qi DB2 "$FILE" && 
    egrep -qi 'DSN=|DATASRC=' && 
    ls -l "$FILE" 
} 
export -f grepit 

find '/shrproj/' -type f -name '*.sas' | parallel grepit 

这将为每个核心运行1个作业。根据您的磁盘系统,并行运行更多或更少的作业可能会更快(使用-j来控制它)。

GNU Parallel是一个通用的并行程序,可以很容易地在同一台机器上或在您拥有ssh访问权限的多台机器上并行运行作业。

如果你想在4个CPU上运行32个不同的工作岗位,并行化直接的方式是在每个CPU上运行8个作业:

Simple scheduling

GNU并行,而不是产生一个新的进程时,一个完成 - 保持CPU的活跃,从而节省了时间:

GNU Parallel scheduling

安装

如果您的发行版没有打包GNU Parallel,则可以执行个人安装,但不需要root访问权限。它可以在10秒内通过这样来完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

对于其他安装选项见http://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解更多

查看更多的例子:http://www.gnu.org/software/parallel/man.html

观看介绍视频: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

走过t他教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

订阅邮件列表,以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

相关问题