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