У меня есть файл журнала, который содержит следующие данные:
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)
Это возможно с помощью 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.
Если вы просто хотите, чтобы возвращались именно те строки, которые находятся на отдельных строках:
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)
Поиск фиксированных строк с помощью 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)
Чтобы получить все, что находится между строками поиска и включая их, используйте 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