2016-05-30 3 views
0

Я хочу знать, как grep несколько предложений из файла, только если условие истинно.Проверьте, содержит ли файл несколько шаблонов

Пример.

file.txt содержит

AA 
BB 
CC 
DD 

Если я делаю Grep AA & ZZ из file.txt. он не должен давать никакого вывода, поскольку в нем нет шаблона ZZ. Он должен удовлетворять условию. Awk или СЭД ничего нормально

+0

Пожалуйста, сформулируйте Ваши оболочки. Также вы имеете в виду, что AA BB CC DD должен находиться в одной строке или только в том же файле? – digipenKH

+0

@Harish Selvam: Вы можете уточнить свое требование с большим количеством контента? – blackSmith

ответ

2

Использование:

grep -vf <(grep -f patterns_file file) patterns_file 

Если вы хотите, чтобы перепроверить, если файл содержит все данные модели, вы можете использовать следующий подход:

  • следует хранить шаблоны в другом файле, один в другой строке.

  • grep оригинальный файл против этого файла шаблонов.

  • И наконец, grep этот результат в отношении файла шаблонов, с перевернутым флагом. Таким образом, будут показаны все остальные шаблоны. Если результат пуст, это означает, что все было найдено.

Файл с данными:

$ cat data 
AA 
BB 
CC 
DD 

Файл с шаблонами:

$ cat pat 
AA 
CC 
TT 

Проверить совпадений в data

$ grep -f pat data 
AA 
CC 

Проверьте, если любой из моделей остаются необоснованный:

$ grep -vf <(grep -f pat data) pat 
TT 
1

Вы хотите что-то вроде этого:

awk '/AA/{f=a=1} /ZZ/{f=z=1} f{hits=hits $0 ORS; f=0} END{if (a && z) printf "%s", hits}' 

обрабатывать случаи, когда АА и/или ZZ появляются несколько раз, можно чередованием друг с другом, например:

$ cat file 
a 
AA 
b 
AA 
c 
ZZ 
d 
AA 
e 
ZZ 
f 

$ awk '/AA/{f=a=1} /ZZ/{f=z=1} f{hits=hits $0 ORS; f=0} END{if (a && z) printf "%s", hits}' file 
AA 
AA 
ZZ 
AA 
ZZ 

Общее решение для поиска любого количества регулярных выражений в файле, btw, будет:

$ cat tst.awk 
BEGIN { 
    split(tgts,tmp) 
    for (idx in tmp) { 
     wanted[tmp[idx]] 
    } 
} 
{ 
    found = 0 
    for (regexp in wanted) { 
     if ($0 ~ regexp) { 
      found = 1 
      seen[regexp] 
     } 
    } 
} 
found { 
    hits = hits $0 ORS 
} 
END { 
    if (length(wanted) == length(seen)) { 
     printf "%s", hits 
    } 
} 

$ awk -v tgts="AA ZZ" -f tst.awk file 
AA 
AA 
ZZ 
AA 
ZZ 

Строка вместо сопоставления с регулярным выражением будет:

for (string in wanted) { 
     if (index($0,string) { 
      found = 1 
      seen[string] 
     } 
    } 
0

Почему вы не искать с

grep -e pattern1 -e pattern2 ... file 
+0

, поскольку шаблоны находятся в разных строках – fedorqui

Смежные вопросы