列出所有不包含 2 个不同字符串的文件
我有一个目录,其中包含许多以模式命名的文件,例如file1.txt
我可以列出所有不包含一个字符串的文件
grep -l "String" file*
如何列出不包含我尝试过的两个字符串的文件?
grep -l "string1|string2" file*
您需要e
grep 的参数,或使用 egrep。
使用 egrep:
egrep -L "string1|string2" file*
假设您只想打印包含所有字符串的文件的名称,这是一个适用于任意数量的字符串的解决方案,并且将进行字符串比较,而不是正则表达式比较:
gawk -v RS='\0' -v strings="string1 string2" '
BEGIN{ numStrings = split(strings,stringsA) }
{
matchCnt = 0
for (stringNr=1; stringNr<=numStrings; stringNr++)
if ( index($0,stringsA[stringNr]) )
matchCnt++
}
matchCnt == numStrings { print FILENAME }
' file*
等一下,我刚刚注意到您要打印不包含 2 个字符串的文件。那将是:
gawk -v RS='\0' -v strings="string1 string2" '
BEGIN{ numStrings = split(strings,stringsA) }
{
matchCnt = 0
for (stringNr=1; stringNr<=numStrings; stringNr++)
if ( index($0,stringsA[stringNr]) )
matchCnt++
}
matchCnt == numStrings { matchesAll[FILENAME] }
END {
for (fileNr=1; fileNr < ARGC; fileNr++) {
file = ARGV[fileNr]
if (! (file in matchesAll) )
print file
}
}
' file*
打印不包含任何字符串的文件的名称将是:
gawk -v RS='\0' -v strings="string1 string2" '
BEGIN{ numStrings = split(strings,stringsA) }
{
for (stringNr=1; stringNr<=numStrings; stringNr++)
if ( index($0,stringsA[stringNr]) )
matchesOne[FILENAME]
}
END {
for (fileNr=1; fileNr < ARGC; fileNr++) {
file = ARGV[fileNr]
if (! (file in matchesOne) )
print file
}
}
' file*