5

2 つの異なる文字列を含まないすべてのファイルを一覧表示する

パターンで名前が付けられた多数のファイルを含むディレクトリがあります(例:file1.txt

1 つの文字列を含まないすべてのファイルを一覧表示できます

grep -l "String" file*

試した 2 つの文字列を含まないファイルを一覧表示するにはどうすればよいですか?

grep -l "string1|string2" file*
4

2 に答える 2

4

egrep または egrep を使用するためのパラメータが必要です。

egrep の場合:

egrep -L "string1|string2" file*
于 2013-02-15T21:40:47.900 に答える
1

すべての文字列を含むファイルの名前だけを出力したい場合、正規表現の比較ではなく、任意の数の文字列に対して機能し、文字列の比較を行うソリューションを次に示します。

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*
于 2013-02-16T13:16:35.683 に答える