2012-05-31 6 views
8

Я использую функцию grep -f для извлечения строк из файла, который соответствует определенному шаблону. Скажем, файл моего шаблона - pattern.txt, как показано ниже.О 'grep -f': match pattern с файлом

1 
2 
3 
4 
5 

И файл, против которого я соответствие этот шаблон file.txt,

1::anv 
2::tyr 
3::yui 
4::fng 
5::gdg 
6::ere 
7::rer 
8::3rr 
9::gty 

Теперь, когда я делаю Grep -f pattern.txt file.txt, я получаю это ->

1::anv 
2::tyr 
3::yui 
4::fng 
5::gdg 
8::3rr 

Последняя строка в выводе выше, вызывает мою проблему. Как мне изменить эту команду grep, чтобы получить результат (показывая правильные соответствия) следующим образом?

1::anv 
2::tyr 
3::yui 
4::fng 
5::gdg 
+0

Я пробовал grep «больше patt.txt'» file.txt | awk -F '::' '{print $ 1 "" $ 2}' Но это также дает мне ту же проблему. – ana

ответ

12

Добавить ^ перед вашими узорами, так что grep будет соответствовать линии начать с рисунком. Если ваш шаблон на самом деле является набором чисел, вам не нужен список шаблонов. Просто используйте ^[1-5]:.

+0

Спасибо. кто это сделал. – ana

+4

просто помните, что^1 будет соответствовать 10 :, и т. Д., Если числа когда-либо получат этот большой. –

6

Ну, есть много возможных решений. Вы говорите grep, чтобы найти все строки, содержащие 3, а строка «8 :: 3rr» на самом деле содержит 3. так что вам нужно быть более конкретным в том, что вы ищете.

Например, вы можете изменить шаблоны на «1:», «2:» и т. Д., Чтобы соответствовать только номерам, за которыми следует двоеточие. Или вы можете изменить их на «^ 1», «^ 2» и т. Д., Чтобы соответствовать только номерам в начале строки. Это зависит от ваших данных, но, вероятно, вы хотите, чтобы оба, так что ваш поиск «1:» не соответствует «21: », и ваш поиск«^5 »не соответствует« 53: ». В этом случае ваш файл шаблонов хотел бы вот так:

^1: 
^2: 
^3: 
^4: 
^5: