stringList
디렉토리를 재귀적으로 검색하여 그 안의 모든 stringList
문자열을 찾으려는 문자열 목록이 있습니다.아니요모든 검색 결과에 나타납니다. 지금 나 한테있어
cat stringList | grep -qrf /dev/stdin .
하지만 그 이후에는 어디로 가야할지 모르겠습니다.
예를 들어 문자열이 있습니다.
부자
술집
버저 소리
디렉토리의 파일 중 foo만 존재합니다. 스크립트가 반환되어야 합니다.
술집
버저 소리
답변1
노력하다:
string="foo
bar
baz"
echo "$string" | grep -v "$(find . -type f -exec cat {} + | grep -o "$string")"
이 방법은 입력 파일을 한 번만 읽기 때문에 선택되었습니다.
어떻게 작동하나요?
find . -type f -exec cat {} +
이는 파일에 대한 재귀 검색을 수행하고 해당 내용을 표준 출력으로 인쇄합니다.
grep -o "$string"
그러면 행과 일치하는 텍스트가 선택됩니다
$string
.echo "$string" | grep -v "$(find . -type f -exec cat {} + | grep -o "$string")"
grep -v
재귀적으로 검색된 파일 중 하나에서 발견되지 않은 문자열의 모든 행을 반환합니다.
예
아래에 다음을 포함하는 파일이 있는 디렉터리를 생각해 보세요.
$ find . -type f -exec cat {} +
bar none
Here baz scaggs
behind bars
bazooka
grep을 추가하면 일치하는 단어만 얻습니다.
$ find . -type f -exec cat {} + | grep -o "$string"
bar
baz
bar
baz
모든 것을 종합해 보면 foo
파일에 없는 유일한 단어는 다음과 같습니다.
$ echo "$string" | grep -v "$(find . -type f -exec cat {} + | grep -o "$string")"
foo
답변2
당신은 이것을 할 수 있습니다 gawk
:
find . -type f -print0 | gawk -v listfile=/path/to/stringList '
BEGIN{
while ((getline string < listfile) > 0) list[string]
RS="\0"
while ((getline file < "/dev/stdin") > 0) ARGV[ARGC++] = file
RS="\n"
}
{for (s in list) if (index($0, s)) delete list[s]}
END {for (s in list) print s}'