[bash] 다른 줄에있는 파일의 여러 문자열에 대한 grep (예 : 줄 기반 검색이 아닌 전체 파일)?

나는 파일이 단어를 포함 grep으로 할 Dansk, Svenska또는 Norsk가능한 반환 코드로, 어떤 라인 (문자열이 포함되어 있다는 정보를 가지고 정말 단지 등 내 한 줄이 더 다음이를 조금 간다).

다음과 같은 줄이있는 많은 파일이 있습니다.

Disc Title: unknown
Title: 01, Length: 01:33:37.000 Chapters: 33, Cells: 31, Audio streams: 04, Subpictures: 20
        Subtitle: 01, Language: ar - Arabic, Content: Undefined, Stream id: 0x20,
        Subtitle: 02, Language: bg - Bulgarian, Content: Undefined, Stream id: 0x21,
        Subtitle: 03, Language: cs - Czech, Content: Undefined, Stream id: 0x22,
        Subtitle: 04, Language: da - Dansk, Content: Undefined, Stream id: 0x23,
        Subtitle: 05, Language: de - Deutsch, Content: Undefined, Stream id: 0x24,
(...)

내가 원하는 의사 코드는 다음과 같습니다.

for all files in directory;
 if file contains "Dansk" AND "Norsk" AND "Svenska" then
 then echo the filename
end

이를 수행하는 가장 좋은 방법은 무엇입니까? 한 줄로 할 수 있습니까?



답변

당신이 사용할 수있는:

grep -l Dansk * | xargs grep -l Norsk | xargs grep -l Svenska

숨겨진 파일에서도 찾으려면 :

grep -l Dansk .* | xargs grep -l Norsk | xargs grep -l Svenska


답변

bash와 grep을 사용하는 또 다른 방법 :

단일 파일 ‘test.txt’의 경우 :

  grep -q Dansk test.txt && grep -q Norsk test.txt && grep -l Svenska test.txt

test.txt파일에 세 가지가 모두 포함되어 있으면 인쇄 합니다 (조합에 관계없이). 처음 두 개의 greps는 아무것도 인쇄하지 않으며 ( -q) 마지막 두 개의 greps는 다른 두 개의 greps 가 통과 된 경우에만 파일을 인쇄합니다.

디렉토리의 모든 파일에 대해 수행하려면 다음을 수행하십시오.

   f in *; grep -q Dansk $ f && grep -q Norsk $ f && grep -l Svenska $ f; 끝난


답변

grep –irl word1 * | grep –il word2 `cat -` | grep –il word3 `cat -`
  • -i 검색 대소 문자를 구분하지 않습니다.
  • -r 폴더를 통해 파일 검색을 재귀 적으로 만듭니다.
  • -l 찾은 단어로 파일 목록을 파이프합니다.
  • cat - 다음 grep이 목록에 전달 된 파일을 살펴 보도록합니다.


답변

다른 줄에있는 파일의 여러 문자열을 grep하는 방법 (파이프 기호 사용) :

for file in *;do
   test $(grep -E 'Dansk|Norsk|Svenska' $file | wc -l) -ge 3 && echo $file
done

메모:

  1. ""grep에 큰 따옴표를 사용하는 경우 다음 과 같이 파이프를 이스케이프해야합니다 \|. Dansk, Norsk 및 Svenska를 검색합니다.

  2. 한 줄에 하나의 언어 만 있다고 가정합니다.

연습 : http://www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/


답변

ack를 사용 하면 정말 쉽게 할 수 있습니다 .

ack -l 'cats' | ack -xl 'dogs'
  • -l: 파일 목록 반환
  • -x: STDIN (이전 검색)에서 파일을 가져 와서 해당 파일 만 검색합니다.

그리고 원하는 파일을 얻을 때까지 계속 파이핑 할 수 있습니다.


답변

awk '/Dansk/{a=1}/Norsk/{b=1}/Svenska/{c=1}END{ if (a && b && c) print "0" }'

그런 다음 쉘로 반환 값을 잡을 수 있습니다.

Ruby (1.9+)가있는 경우

ruby -0777 -ne 'print if /Dansk/ and /Norsk/ and /Svenka/' file


답변

여러 파일에서 여러 단어를 검색합니다.

egrep 'abc|xyz' file1 file2 ..filen