2016-09-09 2 views
0

У меня есть несколько документов, размещенных на экземпляре облака. Я хочу извлечь все слова, соответствующие определенному шаблону, в файл .txt. Это шаблон:Использование grep для определения шаблона

ABC123A 
ABC123B 
ABC765A 

и так один. По сути слова начинаются с определенной строки символов «ABC», имеют фиксированное число цифр и заканчиваются буквой. Это мой код:

grep -oh ABC[0-9].*[a-zA-Z]$ > /home/user/abcLetterMatches.txt 

Когда я выполняю запрос, он работает в течение нескольких часов, не генерируя никакого вывода. У меня более 1100 документов. Однако, когда я запускаю этот запрос:

grep -r ABC[0-9].*[a-zA-Z]$ > /home/user/abcLetterMatches.txt 

Список файлов со строками создается за считанные секунды.

Что мне нужно для корректировки в моем запросе? Кроме того, что вызывает задержку?

UPDATE 1

Исходя из ответов, это очевидно, что команда отсутствует имя файла, на котором она должна быть выполнена. Я хочу запустить код в нескольких файлах документа (> 1000)

Документы, которые я хочу найти, находятся в нескольких подкаталогах внутри каталога. Каков хороший способ их поиска? Выполнение

grep -roh ABC[0-9].*[a-zA-Z]$ > /home/user/abcLetterMatches.txt 

только возвращает имена файлов.

UPDATE 2

Если я использую обновленный код из ответа ниже:

find . -exec grep -oh "ABC[0-9].*[a-zA-Z]$" >> ~/abcLetterMatches.txt {} \; 

Я получаю no file or directory ошибку

UPDATE 3

Шаблон может быть в любом месте линия.

+2

* * работает в течение нескольких часов без генерации какого-либо выхода * 'Это потому, что он ждет ввода. Вы не сказали 'grep' * where * посмотреть, поэтому он читает STDIN. Вы захотите сделать 'grep '. – Biffen

+2

Ваш шаблон будет соответствовать тем, которые не похожи на ваши примеры, например. 'ABC1fooA'. Ваш шаблон просто требует одной цифры после 'ABC', затем ничего. – Barmar

+2

Ваш шаблон будет извлекать 'ABC123A' из шаблонов, таких как' 356XYZABC123A'. Это предназначено? – alvits

ответ

1

Вы можете использовать регулярное выражение:

~/ grep -E "^ABC[0-9]{3}[A-Z]$" docs > filename 
ABC123A 
ABC123B 
ABC765A 
+0

Сопряжит все, что содержит ваш шаблон, такой как 'XYZABC123A2356fghf65'. – alvits

1

Там нет задержки, grep просто ждет ввода вы не дали его (и, следовательно, он ждет от стандартного ввода, по умолчанию).Вы можете исправить вашу команду, снабжая аргумент с именем файла:

grep -oh "ABC[0-9].*[a-zA-Z]$" file.txt > /home/user/abcLetterMatches.txt 

Источника (man grep):

SYNOPSIS 
     grep [OPTIONS] PATTERN [FILE...] 

Чтобы выполнить то же оглавление на несколько файлов рекурсивен, объединить его с find команды:

find . -exec grep -oh "ABC[0-9].*[a-zA-Z]$" >> ~/abcLetterMatches.txt {} \; 
+0

Поместите шаблон в кавычки. – Barmar

+0

@ Бармар, просто сделал это. – syntagma

+0

Я вижу. Я хочу запустить команду в кучке каталогов, в которых есть документы. Проверка по отдельному файлу не представляется возможным, учитывая, что их так много. Я редактирую вопрос, чтобы включить эту информацию. – kurious

0

Делает то, что вы просите:

grep -hr '^ABC[0-9]\{3\}[A-Za-z]$' 
  • -h, чтобы не получить имена файлов.
  • -r для поиска r в экстерьере. Если каталог не указан (как указано выше), используется текущий. В противном случае просто укажите один из них в качестве последнего аргумента.
  • Котировки вокруг рисунка, чтобы избежать случайной универсализации, и т.д.
  • ^ в начале узора к - вместе с $ в конце - только совпадают целые строки. (Не уверен, что это было требованием, но данные выборки подсказывают это.)
  • \{3\}, чтобы указать, что должно быть три цифры.
  • No .*, поскольку это будет соответствовать целым рядом других вещей.
+0

шаблон может быть в любом месте линии. соответственно, обновил вопрос. это будет здорово, если вы сможете отредактировать свой ответ соответственно. – kurious

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