захват подстроки от результата grep

Учитывая файл журнала, я буду обычно делать что-то вроде этого:

grep 'marker-1234' filter_log

Каково различие в использовании '' или "" или ничто в шаблоне?

Вышеупомянутое grep команда приведет ко многим тысячам строк; чего я требую. В тех строках обычно существует один блок данных, которые я после. Иногда, я использую awk для распечатывания полей, которые я после. В этом случае, изменения формата журнала, я не могу полагаться на положение исключительно, не говоря уже о, фактические регистрируемые данные могут продвинуть положение.

Для создания этого понятным, позволяет, говорят, что строка журнала содержала IP-адрес, и это было всем, чем я был после, таким образом, я могу позже передать ее по каналу к виду и уникальный и получить некоторые количества счета.

Пример может быть:

2010-04-08 some logged data, indetermineate chars - [marker-1234] (123.123.123.123) from: foo@bar.example.com to bar@foo.example.com [stat-xyz9876]

Первая команда grep даст мне много тысяч строк как вышеупомянутое, оттуда, я хочу передать его по каналу к чему-то, вероятно sed, который может вытащить шаблон в и распечатать только шаблон.

Для этого примера с помощью был бы достаточен IP-адрес. Я попробовал. sed не способный понять [0-9] {1,3}. как шаблон? Я имел к [0-9] [0-9] [0-9]. который привел к странным результатам, пока весь шаблон не создал.

Это не характерно для IP-адреса, шаблон изменится, но я могу использовать это в качестве шаблона изучения.

Спасибо всем.

4
задан 09.04.2010, 04:18

4 ответа

Я не знаю то, что ОС Вы идете, но на FreeBSD 7.0 + grep имеет a -o опция возвратить только часть, которая соответствует шаблону. Таким образом, Вы могли
grep "marker-1234" filter_log | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

Возвращает список просто IP-адресов от 'filter_log"...

Это работает над моей системой, но снова, я не знаю то, что поддерживает Ваша версия grep.

6
ответ дан 07.12.2019, 19:16

можно сделать все они во всего один awk команда. Никакая потребность использовать любые другие инструменты

$ awk '/marker-1234/{for(o=1;o<=NF;o++){if($o~/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/)print $o }  }' file
(123.123.123.123)
3
ответ дан 07.12.2019, 19:16

Можно сократить второе grep немного как это:

grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'

Для ответа на первый вопрос, двойные кавычки позволяют оболочке делать различные вещи как переменное расширение, но защищать некоторые метасимволы от необходимости быть оставленным. Одинарные кавычки препятствуют тому, чтобы оболочка делала те расширения. Используя никакие кавычки оставляет вещи широко открытыми.

$ empty=""
$ text1="some words"
$ grep $empty some_file
(It seems to hang, but it's just waiting for input since it thinks "some_file" is 
the pattern and no filename was entered, so it thinks input is supposed to come
from standard input. Press Ctrl-d to end it.)
$ grep "$empty" some_file
(The whole file is shown since a null pattern matches everything.)
$ grep $text1 some_file
grep: words: No such file or directory
some_file:something
some_file:some words
(It sees the contents of the variable as two words, the first is seen as the 
pattern, the second as one file and the filename as a second file.)
$ grep "$text1" some_file
some_file:some words
(Expected results.)
$ grep '$text1' some_file
(No results. The variable isn't expanded and the file doesn't contain a
string that consists of literally those characters (a dollar sign followed
by "text1"))

Можно узнать больше в разделе "QUOTING" man bash

2
ответ дан 07.12.2019, 19:16

Ищите xargs команда. Необходимо смочь сделать что-то как:

grep 'маркер 1234' filter_log|xargs grep" (" |cut-c1-15

Это не может быть этим точно, но xargs команда, которую Вы хотите использовать

1
ответ дан 07.12.2019, 19:16

Теги

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