Вопрос по использованию grep - PullRequest
1 голос
/ 16 марта 2011
 127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/ HTTP/1.1" 200 169 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/.treeinfo HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/Fedora HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/Server HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/Client HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/RedHat HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/CentOS HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/SL HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/directory.yast HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/current/images/MANIFEST HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/images/daily/MANIFEST HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/boot/platform/i86xpv/kernel/unix HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/platform/i86xpv/kernel/unix HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/STARTUP/XNLOADER.SYS HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/images/xen/vmlinuz HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/images/boot.iso HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/boot/boot.iso HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/current/images/netboot/mini.iso HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:27 +0530] "HEAD /sk/install/images/boot.iso HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/ HTTP/1.1" 200 169 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/.treeinfo HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/Fedora HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/Server HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/Client HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/RedHat HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/CentOS HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/SL HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/directory.yast HTTP/1.1" 404 182 "-" "Python-urllib/2.6"
127.0.0.1 - - [08/Mar/2011:00:26:35 +0530] "HEAD /sk/current/images/MANIFEST HTTP/1.1" 404 182 "-" "Python-urllib/2.6" 

У меня есть файл вышеупомянутой структуры, и он называется log.txt. Теперь я делаю

 cat log.txt | grep '[*]' 

не было вывода тогда я сделал

 cat log.txt | grep '\[* \]' 

опять не было выхода но когда я сделал

 cat log.txt | grep '\[.*\]'

тогда был вывод, как это работает?

ОБНОВЛЕНИЕ

Я пытаюсь найти метки времени в журнале выше.

Ответы [ 4 ]

6 голосов
/ 16 марта 2011
cat log.txt | grep '[*]' 

Эта командная строка ищет в файле log.txt строки, содержащие в себе *.Поскольку ни одна из строк вашего ввода не имеет *, вы ничего не получите.Обратите внимание, что [..] в регулярном выражении называется классом символов, который соответствует любому символу внутри него.

cat log.txt | grep '\[* \]' 

Эта командная строка ищет в файле строки, которые имеют ноль или более литерала [, за которым следует пробел, за которым следует литерал ].Снова у вас нет таких строк.Здесь вы избежали [ и ].Это делает их не особенными.Таким образом, они больше не образуют класс символов, а обрабатываются буквально.

cat log.txt | grep '\[.*\]'

Этот поиск ищет строки, в которых за [ следует что-нибудь (.*), за которым следует ].Поскольку у вас есть такие строки, вы получите вывод.

Наконец,

 cat file | grep pattern

называется бесполезным использованием cat и может быть записано как:

grep pattern file
1 голос
/ 16 марта 2011
1 голос
/ 16 марта 2011

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

  • [: один раз символ '['
  • . *: Любой символ (.) В любое время от 0 до бесконечности (*)
  • ]: один раз символ ']'

Запись \[*\] будет означать "символ '[' любое количество раз, а затем символ ']'". Поскольку написание [*] ничего бы не значило, поскольку [] является маркером для группы символов. В man grep есть краткое объяснение регулярных выражений, и вы можете найти гораздо больше онлайн

1 голос
/ 16 марта 2011

В регулярных выражениях точка "."означает «любой символ», а звездочка «*» означает: сопоставьте меня, если предшествующий мне символ присутствует 0 или более раз.«[» и «]» используются для ограничения класса символов.

Итак:

  1. "[*]" соответствует только звезде
  2. "\ [* \ [" означает взять любой '[' с последующим ']'
  3. "\ [. * \]" взять все, что начинается с '[', за которым следует любой символ, за которым следует '\]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...