Как выполнить grep информация из нескольких строк?

У меня есть файл журнала, который содержит следующие данные:

2019-02-11 00:05:58.241 [exec-178] Start request
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.243 [exec-178] other process
2019-02-11 00:05:58.244 [exec-178] other process
2019-02-11 00:05:58.245 [exec-178] results
2019-02-11 00:05:58.246 [exec-178] End request (13ms)

Я хочу использовать одну команду grep для захвата «имя_клиента» и «Завершить запрос». Я пытался использовать grep -E "[0-9]{2,4}ms, но это не дает ожидаемого результата.

Ожидаемый результат:

2019-02-11 00:05:58.242 [exec-178] customer_name 
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
0
14.02.2019, 15:11
4 ответа

Это возможно с помощью grep -E, и шаблоны, которые вы ищете, разделяются знаком вертикальной черты.

[root@server ~]# grep -Ei "customer_name|end request" file 
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
[root@server ~]# 

Извлечено изman grep:

-E, --extended-regexp Interpret PATTERN as an extended regular expression (ERE, see below).

-i, --ignore-case Ignore case distinctions in both the PATTERN and the input files.

1
28.01.2020, 03:59

Если вы просто хотите, чтобы возвращались именно те строки, которые находятся на отдельных строках:

egrep -o "customer_name|End request" logfile

Выход:

customer_name
End request

Если вы хотите, чтобы возвращались все строки:

egrep "customer_name|End request" logfile

Выход

2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
0
28.01.2020, 03:59

Поиск фиксированных строк с помощью grepочень прост. Вы можете передать несколько паттернов в grep, используя опцию -e:

.
$ cat testfile
2019-02-11 00:05:58.241 [exec-178] Start request
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.243 [exec-178] other process
2019-02-11 00:05:58.244 [exec-178] other process
2019-02-11 00:05:58.245 [exec-178] results
2019-02-11 00:05:58.246 [exec-178] End request (13ms)

$ grep -F -e 'customer_name' -e 'End request' testfile
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.246 [exec-178] End request (13ms)

Опция -Fиспользуется для указания того, что вы ищете фиксированные строки. Это не совсем необходимо, но помогает сделать команду более явной.

Вы также можете немного упростить команду, используя расширенное регулярное выражение. Выражение A|B используется для поиска «A» или «B».

$ grep -E 'customer_name|End request' testfile
2019-02-11 00:05:58.242 [exec-178] customer_name
2019-02-11 00:05:58.246 [exec-178] End request (13ms)
0
28.01.2020, 03:59

Чтобы получить все, что находится между строками поиска и включая их, используйте awk:

awk 'BEGIN {found=0}; /customer_name/ {found=1}; found {print}; /End request/ {found=0}' logfile

И если ваше "имя клиента _" не статическая строка, а разные значения, попробуйте использовать -v, например.:

awk -v "name=sally" 'BEGIN {found=0}; index($0, name) {found=1}; found {print}; /End request/ {found=0}' logfile

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

awk -v "name=sally" 'BEGIN {
        # good style, but optional... nonexistent variables are already 0
        found=0;
    };
    index($0, name) {
        # remember that we found the first line
        found=1;
    }; 
    found {
        # since we print after the found=1, we print that line
        # and also the lines between
        # and since we set found=0 after already printing the end line, we are printing that too
        print;
    }; 
    /End request/ {
        # mark that we stop printing
        found=0;
    };' logfile
0
28.01.2020, 03:59

Теги

Похожие вопросы