Как мне передать команду grep для поиска определенной строки, когда часть этой строки неизвестна?

370
user4493605

Программа, над которой я работаю, используется grepдля поиска в системном журнале определенного предупреждения, однако элемент записи системного журнала, который я ищу, будет относиться именно к этой записи и поэтому будет фактически «случайным».

Примером того, что я ищу, может быть:

tail -f log | grep "string string" 

Заранее спасибо.

0
Используйте `. *` Там, где вы поставили `` для подстановочного знака "что-нибудь". dsstorefile1 5 лет назад 0

1 ответ на вопрос

-2
C0deDaedalus

Вам нужно использовать WildCards (или Globbing Patterns) в grepкоманде, например так:

 tail -f log | grep "some_string.*some_string" 

Где, .*(также отмеченный @ dsstorefile1 в комментариях) здесь используется шаблон сглаживания. Чтобы получить более подробную информацию о паттернах Globbing, обратитесь к man-страницам.


man 7 glob 

Который покажет это:

 . (dot) : will match any single character (except end of line),  equivalent to ? (question mark) in standard wildcard expressions.  * (asterisk) : the proceeding item is to be matched zero or more times. ie. n* will match n, nn, nnnn, nnnnnnn but not na or any other character. 

Теперь, комбинируя оба из них, вы получите:

.* (dot and asterisk) : match any string, equivalent to * in standard wildcards. 

Кроме того, как отмечает @Bob в комментариях, использование .*?намного лучше, чем.*

`. *` жадный и может захватывать больше, чем вы хотите. `. *?` обычно лучше. Bob 5 лет назад 2
Это не имеет ничего общего с «?» Вместо «.`». Прочитайте мой комментарий еще раз - `?` Является модификатором для `*`, делая его ленивым вместо жадного значения по умолчанию. Предполагая PCRE. Bob 5 лет назад 1
Я также должен отметить, что это регулярное выражение (по умолчанию grep делает регулярное выражение POSIX), а не глобус оболочки. Bob 5 лет назад 2
@Bob отредактировал мой ответ и не могли бы вы уточнить, как `` * * `более жадный и использует вместо него`. *? `. C0deDaedalus 5 лет назад 0
Прочитайте это: https://www.regular-expressions.info/repeat.html, особенно «Остерегайтесь жадности!» Разделы "Лень вместо жадности". Смотрите также, https://stackoverflow.com/questions/2301285/what-do-lazy-and-greedy-mean-in-the-context-of-regular-expressions Bob 5 лет назад 0
[globbing] (https://en.wikipedia.org/wiki/Glob_ (программирование))! = [regex] (https://en.wikipedia.org/wiki/Regular_expression) Cyrus 5 лет назад 1