grep для нескольких строк в файле на разных строках (т. е. весь файл, а не поиск по строке)? - PullRequest
78 голосов
/ 25 января 2011

Я хочу использовать 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, 
(...)

Вот псевдокод того, что мне нужно:

Каков наилучший способ сделать это?Можно ли это сделать в одну строку?

Ответы [ 14 ]

81 голосов
/ 25 января 2011

Вы можете использовать:

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

Если вы также хотите найти в скрытых файлах:

grep -l Dansk .* | xargs grep -l Norsk | xargs grep -l Svenska
21 голосов
/ 25 января 2011

Еще один способ, использующий только bash и grep:

Для одного файла 'test.txt':

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

Напечатает test.txt, если файл содержит все три (влюбая комбинация).Первые два greps ничего не печатают (-q), а последний печатает файл, только если два других прошли.

Если вы хотите сделать это для каждого файла в каталоге:

   for f in *; do grep -q Dansk $f && grep -q Norsk $f && grep -l Svenska $f; done
15 голосов
/ 13 мая 2013
grep –irl word1 * | grep –il word2 `cat -` | grep –il word3 `cat -`
  • -i делает поиск нечувствительным к регистру
  • -r делает поиск файлов рекурсивным по папкам
  • -l передает список файлов с найденным словом
  • cat - заставляет следующий grep просматривать файлы, переданные в этот список.
10 голосов
/ 25 января 2011

Как выполнить поиск нескольких строк в файле на разных строках (используйте символ канала):

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

Примечания:

  1. Если вы используете двойные кавычки "" со своим grep, вам нужно будет выйти из трубы следующим образом: \| для поиска Данска, Норска и Свенски.

  2. Предполагается, что в одной строке только один язык.

Прохождение: http://www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/

6 голосов
/ 15 сентября 2017

Поиск нескольких слов в нескольких файлах:

egrep 'abc|xyz' file1 file2 ..filen 
5 голосов
/ 19 декабря 2013

Вы можете сделать это очень легко с ack :

ack -l 'cats' | ack -xl 'dogs'
  • -l: вернуть список файлов
  • -x: взять файлы из STDIN (предыдущий поиск) и искать только эти файлы

И вы можете просто продолжать пайпинг, пока не получите только те файлы, которые вам нужны.

4 голосов
/ 25 января 2011
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
3 голосов
/ 17 апреля 2016

Просто:

grep 'word1\|word2\|word3' *

см. этот пост для получения дополнительной информации

2 голосов
/ 25 января 2011

Это смесь ответов Гленна Джекмана и Куруми, которая допускает произвольное количество регулярных выражений вместо произвольного числа фиксированных слов или фиксированного набора регулярных выражений.

#!/usr/bin/awk -f
# by Dennis Williamson - 2011-01-25

BEGIN {
    for (i=ARGC-2; i>=1; i--) {
        patterns[ARGV[i]] = 0;
        delete ARGV[i];
    }
}

{
    for (p in patterns)
        if ($0 ~ p)
            matches[p] = 1
            # print    # the matching line could be printed
}

END {
    for (p in patterns) {
        if (matches[p] != 1)
            exit 1
    }
}

Запустите его следующим образом:

./multigrep.awk Dansk Norsk Svenska 'Language: .. - A.*c' dvdfile.dat
1 голос
/ 15 августа 2012

Я сделал это с двумя шагами.Составьте список CSV-файлов в одном файле. С помощью комментариев на этой странице я сделал два шага без сценариев, чтобы получить то, что мне нужно.Просто введите в терминал:

$ find /csv/file/dir -name '*.csv' > csv_list.txt
$ grep -q Svenska `cat csv_list.txt` && grep -q Norsk `cat csv_list.txt` && grep -l Dansk `cat csv_list.txt`

он сделал именно то, что мне нужно - напечатать имена файлов, содержащие все три слова.

Также обратите внимание на символы типа `' "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...