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 | 只打印包含匹配项的文件的名称

时间:原作者:0个回答

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
原作者:
...