bash - bash如何查找包含字符串N 次或者更频繁的文件的文件

  显示原文与译文双语对照的内容
140 0

我有一个包含 400 -500 sql文件的文件夹,并且需要
仅包含字符串 CREATE TABLE 3次或者更多的人。

命令时
$ egrep -rl"(CREATE TABLE)"./*.sql
打印我当然所有的文件名,命令
$ egrep -rl"(CREATE TABLE.*){3}"./*.sql
根本不打印任何东西。

标志:
R,--recursive
-l,--files-with-matches | 只打印包含匹配项的文件的名称

时间: 原作者:

53 5

你的commamd


egrep -rl"(CREATE TABLE.*){3}"./*.sql



在一行中查找 3 CREATE TABLE 。 在不同的行上,你需要做不同的事情,当你有 GNU grep时,你就很幸运了: 它有 -z 选项。


# minimal change of your command


egrep -zrl"(CREATE TABLE.*){3}"./*.sql


# moving option E to the options as suggested by @anubhava


grep -zErl"(CREATE TABLE.*){3}"./*.sql



107 0

这里 awk 将执行以下任务:


awk '/CREATE TABLE/{++n} n>2{print FILENAME; n=0; nextfile}' *.sql



原作者:
55 4

请你试一下好。 我正在处理后台打开的文件的数量。


awk '/CREATE TABLE/{++n} n>2{print FILENAME;n="";nextfile}' *.sql



原作者:
109 2

试试这个Perl解决方案


perl -le ' BEGIN { for(glob("*.sql")) { $x=qx(cat $_); $r++ for($x=~m/CREATE TABLE/g); print $_ if $r> 2 ; $r=0 } } '



122 4

假设每行有多个字符串,( 只有的答案是 of ),这里是awk版本( 一个支持 nextfile )


awk '(FNR==1){n=0}


 {n+=split($0,a,/CREATE TABLE/)-1}


 (n>2) {print FILENAME; nextfile}' */.sql



...