Π‘ΡΠΊΠΎΠ½ΠΎΠΌΡŒΡ‚Π΅ 15% Π½Π° всСх хостинговых услугах

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ свои Π½Π°Π²Ρ‹ΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ скидку Π½Π° любой Ρ‚Π°Ρ€ΠΈΡ„Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΊΠΎΠ΄: Skills ΠΠ°Ρ‡Π°Ρ‚ΡŒ
Π ΡƒΠ±Ρ€ΠΈΠΊΠΈ
Linux

Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `grep` для поиска ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Π°Ρ…

Команда grep β€” сокращСниС ΠΎΡ‚ Global Regular Expression Print β€” это ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Unix/Linux, которая построчно сканируСт ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ. Она являСтся стандартом Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ для поиска тСкста Π² любой POSIX-совмСстимой систСмС ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ рСгулярныС выраТСния, Ρ‡Ρ‚ΠΎ позволяСт Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ всё β€” ΠΎΡ‚ простой строки Π΄ΠΎ слоТных ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… шаблонов.

Если Π½ΡƒΠΆΠ΅Π½ максимально ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‚: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ grep "pattern" filename для поиска Π² Ρ„Π°ΠΉΠ»Π΅, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -r для рСкурсивного поиска ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², -i для поиска Π±Π΅Π· ΡƒΡ‡Ρ‘Ρ‚Π° рСгистра ΠΈ -n для отобраТСния Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² строк рядом с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ. Π Π°Π·Π΄Π΅Π»Ρ‹ Π½ΠΈΠΆΠ΅ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с рСгулярными выраТСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ руководств ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚.

Как grep Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ

grep Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ построчно ΠΈ примСняСт ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚, построСнный Π½Π° основС вашСго рСгулярного выраТСния, ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС. РСализация GNU (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Linux) примСняСт Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Boyer-Moore-Horspool для Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… строк ΠΈ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Thompson NFA для шаблонов рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ИмСнно эта Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π΄Π΅Π»Π°Π΅Ρ‚ grep ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрым Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… β€” ΠΎΠ½ ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ инструмСнтов Π½Π° основС PCRE, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ perl ΠΈΠ»ΠΈ python.

Π’ сСмСйствС GNU coreutils ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… исполняСмых Ρ„Π°ΠΉΠ»Π°:

ΠšΠΎΠΌΠ°Π½Π΄Π°Π”Π²ΠΈΠΆΠΎΠΊΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅
grepBRE / ERE (с -E)Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ построчноС сопоставлСниС
egrepERE (Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ рСгулярныС выраТСния)Π‘ΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ для grep -E
fgrepВолько фиксированныС строкиБамый быстрый; Π±Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
zgrepBRE / ERE для сТатых файловАрхивы .gz, .bz2
pgrepБопоставлСниС ΠΈΠΌΡ‘Π½ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΠ²ΠŸΠΎΠΈΡΠΊ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ процСссов, Π° Π½Π΅ Π² Ρ„Π°ΠΉΠ»Π°Ρ…

egrep ΠΈ fgrep ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ псСвдонимами Π² соврСмСнных систСмах; для пСрСносимости Π² скриптах ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ grep -E ΠΈ grep -F соотвСтствСнно.

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ синтаксис

grep [options] pattern [file ...]
  • pattern β€” строка ΠΈΠ»ΠΈ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π·Π°ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠ΅ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ
  • file β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько ΠΏΡƒΡ‚Π΅ΠΉ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ; Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, читаСтся ΠΈΠ· стандартного Π²Π²ΠΎΠ΄Π°
  • options β€” Ρ„Π»Π°Π³ΠΈ, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ сопоставлСния, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, находящий ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ слово "error", Π² syslog:

grep "error" /var/log/syslog

ВсСгда Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ шаблон Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ Π±Π΅Π· ΠΊΠ°Π²Ρ‹Ρ‡Π΅ΠΊ, содСрТащиС мСтасимволы ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ (*, ?, [, $), Π±ΡƒΠ΄ΡƒΡ‚ раскрыты ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ grep ΠΈΡ… ΡƒΠ²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ администратор

Поиск Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ явно ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ подстановочныС Π·Π½Π°ΠΊΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ:

grep "error" access.log error.log debug.log
grep "error" *.log

Для поиска ΠΏΠΎ всСму Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ -r (ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ символичСским ссылкам с -R):

grep -r "error" /var/log/

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: На Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… сСрвСрах с Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ иСрархиями ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ -r ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° I/O. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΡŒΡ‚Π΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ поиска с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ --include, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ сканирования Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² с Π½Π΅Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹ΠΌΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ:

grep -r --include="*.log" "error" /var/log/

Поиск Π±Π΅Π· ΡƒΡ‡Ρ‘Ρ‚Π° рСгистра (-i)

grep -i "error" application.log

Π­Ρ‚ΠΎ соотвСтствуСт error, Error, ERROR, eRrOr ΠΈ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°ΠΌ написания. Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ GNU grep с Ρ„Π»Π°Π³ΠΎΠΌ -i ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΈ шаблон, ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π½ΠΈΠΆΠ½ΠΈΠΉ рСгистр ΠΏΠ΅Ρ€Π΅Π΄ сравнСниСм, Ρ‡Ρ‚ΠΎ создаёт нСбольшиС Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ….

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² строк (-n)

grep -n "error" application.log

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°:

25:error occurred during processing
103:error: connection refused

НомСра строк Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΡ‹, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ нСпосрСдствСнно ΠΊ совпадСнию Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅: vim +25 application.log ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» Π½Π° строкС 25.

ΠŸΠΎΠ΄ΡΡ‡Ρ‘Ρ‚ совпадСний (-c)

grep -c "error" application.log

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСство ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… строк, Π° Π½Π΅ сами строки. ΠŸΡ€ΠΈ поискС Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ собствСнный счётчик:

grep -c "error" *.log
access.log:0
debug.log:14
error.log:3

Π˜Π½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ сопоставлСниС (-v)

grep -v "error" application.log

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку, которая Π½Π΅ соотвСтствуСт ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ строк ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΅Π³ΠΎ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ:

grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"

Π­Ρ‚ΠΎ удаляСт ΠΊΠ°ΠΊ строки ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² (Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…ΡΡ с #), Ρ‚Π°ΠΊ ΠΈ пустыС строки, оставляя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹.

БопоставлСниС Ρ†Π΅Π»Ρ‹Ρ… слов (-w)

grep -w "error" application.log

Π‘Π΅Π· -w поиск error Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΉΠ΄Ρ‘Ρ‚ errors, error_code ΠΈ myerror. Π€Π»Π°Π³ -w привязываСт совпадСниС ΠΊ Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌ слов, опрСдСляСмым ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ словСсными символами ([a-zA-Z0-9_]) ΠΈ нСсловСсными символами.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… строк (-m)

grep -m 5 "error" application.log

grep ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° послС нахоТдСния 5 ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… строк. На Ρ„Π°ΠΉΠ»Π΅ ΠΆΡƒΡ€Π½Π°Π»Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 10 Π“Π‘, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ лишь ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ шаблона, -m 1 ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя выполнСния с сСкунд Π΄ΠΎ миллисСкунд, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ grep Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ сразу послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ совпадСния.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ контСкста (-A, -B, -C)

Одна ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… возмоТностСй. ΠŸΡ€ΠΈ диагностикС ошибки ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΠ΅ строки часто содСрТат ΠΏΠ΅Ρ€Π²ΠΎΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ:

grep -A 3 "error" application.log   # 3 lines After the match
grep -B 3 "error" application.log   # 3 lines Before the match
grep -C 3 "error" application.log   # 3 lines of Context (before and after)

Π­Ρ‚ΠΎ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ error: connection refused ΠΈ ΠΏΠΎΠ»Π½ΡƒΡŽ трассировку стСка ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ запрос, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π¦Π²Π΅Ρ‚ΠΎΠ²ΠΎΠ΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (--color)

grep --color=auto "error" application.log

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ дистрибутивов ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ alias grep='grep --color=auto' Π² /etc/profile.d/ ΠΈΠ»ΠΈ ~/.bashrc. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ --color=always ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ Π² less -R для сохранСния ANSI-ΠΊΠΎΠ΄ΠΎΠ²:

grep --color=always "error" application.log | less -R

Π’Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΉ части (-o)

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ grep Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ всю ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΡƒΡŽ строку. Π€Π»Π°Π³ -o Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρƒ Ρ‡Π°ΡΡ‚ΡŒ строки, которая соотвСтствуСт ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ:

grep -o "192.[0-9]*.[0-9]*.[0-9]*" access.log

Π­Ρ‚ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ IPv4-адрСс ΠΈΠ· ΠΆΡƒΡ€Π½Π°Π»Π° доступа β€” ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ адрСсу Π½Π° строку Π²Ρ‹Π²ΠΎΠ΄Π° β€” Ρ‡Ρ‚ΠΎ идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ Π² sort | uniq -c | sort -rn для поиска Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

ПодавлСниС Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠΌΡ‘Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² (-h) ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ (-H)

ΠŸΡ€ΠΈ поискС Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… grep добавляСт имя Ρ„Π°ΠΉΠ»Π° ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ совпадСниСм. -h подавляСт это; -H ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ поискС Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ -H Π² скриптах для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ согласованного Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π²Ρ‹Π²ΠΎΠ΄Π° нСзависимо ΠΎΡ‚ количСства ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

Π’Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΡ‘Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² (-l ΠΈ -L)

grep -l "error" *.log    # files that contain the pattern
grep -L "error" *.log    # files that do NOT contain the pattern

ПолСзно Π² скриптах развёртывания для опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

РСгулярныС выраТСния Π² grep

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ рСгулярныС выраТСния (BRE)

grep ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ BRE. ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ мСтасимволы:

ΠœΠ΅Ρ‚Π°ΡΠΈΠΌΠ²ΠΎΠ»Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€
^Начало строкиgrep "^error" β€” строки, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с "error"
$ΠšΠΎΠ½Π΅Ρ† строкиgrep "error$" β€” строки, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° "error"
.Π›ΡŽΠ±ΠΎΠΉ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ символgrep "err.r" β€” соотвСтствуСт "error", "errar" ΠΈ Ρ‚.Π΄.
*Ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…grep "err*" β€” "er", "err", "errr" ΠΈ Ρ‚.Π΄.
[abc]Класс символовgrep "[aeiou]" β€” любая гласная
[^abc]ΠžΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ классgrep "[^0-9]" β€” любой Π½Π΅Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ символ
Π­ΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ мСтасимволаgrep "." β€” Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ°

Π’ BRE символы +, ?, {, }, (, ) ΠΈ | Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ экранированы ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ косой Ρ‡Π΅Ρ€Ρ‚ΠΎΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ мСтасимволы. Π­Ρ‚ΠΎ распространённый источник ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ BRE ΠΈ ERE.

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ рСгулярныС выраТСния (ERE) с -E

grep -E "error|failure|critical" application.log

ERE Π΄Π΅Π»Π°Π΅Ρ‚ синтаксис Ρ‡ΠΈΡ‰Π΅ β€” +, ?, |, () ΠΈ {} Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π±Π΅Π· ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… косых Ρ‡Π΅Ρ€Ρ‚:

grep -E "err(or|ata)?" application.log       # matches "err", "error", "errata"
grep -E "[0-9]{1,3}.[0-9]{1,3}" access.log  # partial IP pattern
grep -E "^(ERROR|WARN|FATAL)" app.log        # lines starting with severity levels

Perl-совмСстимыС рСгулярныС выраТСния (PCRE) с -P

GNU grep ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ PCRE Ρ‡Π΅Ρ€Π΅Π· Ρ„Π»Π°Π³ -P, открывая доступ ΠΊ ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰ΠΈΠΌ ΠΈ рСтроспСктивным ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΆΠ°Π΄Π½Ρ‹ΠΌ ΠΊΠ²Π°Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌ:

grep -P "(?<=user=)w+" auth.log    # extract username after "user="
grep -P "d{4}-d{2}-d{2}" app.log # ISO date format

Π’Π°ΠΆΠ½ΠΎ: -P являСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ GNU ΠΈ нСдоступСн Π² BSD grep (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² macOS). Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ -P, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ пСрСносимыми Π±Π΅Π· установки GNU grep (brew install grep Π² macOS).

Поиск Π² сТатых Ρ„Π°ΠΉΠ»Π°Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ zgrep

Ротация ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ сТимаСт старыС ΠΆΡƒΡ€Π½Π°Π»Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ gzip. zgrep позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ поиск Π² Π½ΠΈΡ… Π±Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠΉ распаковки:

zgrep "error" /var/log/syslog.2.gz

Для Ρ„Π°ΠΉΠ»ΠΎΠ² .bz2 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ bzgrep. Для Ρ„Π°ΠΉΠ»ΠΎΠ² .xz ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ xzgrep. Если Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π² сТатых ΠΈ нСсТатых ΠΆΡƒΡ€Π½Π°Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

zgrep -r "error" /var/log/

ΠžΡΠΎΠ±Ρ‹ΠΉ случай: zgrep Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ zcat для распаковки, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ Π² grep. Он Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ всС Ρ„Π»Π°Π³ΠΈ grep. Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ -P ΠΈΠ»ΠΈ -o для сТатых Ρ„Π°ΠΉΠ»ΠΎΠ², сначала распакуйтС ΠΈΡ… Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ zcat file.gz | grep -P "pattern".

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ grep с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ

Настоящая ΠΌΠΎΡ‰ΡŒ grep проявляСтся ΠΏΡ€ΠΈ Π΅Π³ΠΎ использовании совмСстно с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρ‹.

Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ Π²Ρ‹Π²ΠΎΠ΄Π° процСссов

ps aux | grep "[n]ginx"

Π’Ρ€ΡŽΠΊ со скобками [n]ginx ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ появлСниС самого процСсса grep Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ шаблон [n]ginx Π½Π΅ соотвСтствуСт Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠΉ строкС [n]ginx Π² спискС процСссов.

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ²

grep "error" application.log | sort | uniq -c | sort -rn | head -20

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€: Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ всС строки с ошибками, сортируСт ΠΈΡ…, подсчитываСт ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ вхоТдСния, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ сортируСт ΠΏΠΎ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ частоты ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ 20 Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространённых ошибок. Π­Ρ‚ΠΎ пСрвичная Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° сортировки ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ любом производствСнном ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π΅.

Поиск Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТащих шаблон, с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ дСйствиями Π½Π°Π΄ Π½ΠΈΠΌΠΈ

grep -rl "deprecated_function" /var/www/html/ | xargs sed -i 's/deprecated_function/new_function/g'

grep -rl Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ список Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТащих шаблон; xargs ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΠΈΡ… Π² sed для Π·Π°ΠΌΠ΅Π½Ρ‹ Π½Π° мСстС. ВсСгда провСряйтС Π±Π΅Π· -i сначала ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ -i.bak для создания Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Ρ… ΠΊΠΎΠΏΠΈΠΉ.

Поиск Ρ‡Π΅Ρ€Π΅Π· SSH

ssh user@server "grep -r 'error' /var/log/app/" | less

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ grep Π½Π° ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΌ сСрвСрС ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» β€” это ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ„Π°ΠΉΠ»Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² слишком Π²Π΅Π»ΠΈΠΊΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ.

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с awk для структурированного Ρ€Π°Π·Π±ΠΎΡ€Π°

grep "POST /api" access.log | awk '{print $1, $7, $9}'

grep Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹Π΅ строки; awk ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ поля (IP, URL, ΠΊΠΎΠ΄ состояния). Π­Ρ‚Π° комбинация справляСтся с Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ Π·Π°Π΄Π°Ρ‡ Π°Π½Π°Π»ΠΈΠ·Π° ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π±Π΅Π· нСобходимости Π² спСциализированной ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ².

БообраТСния ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

На Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ высокочастотной Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ эти ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ -F для Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… строк. grep -F "exact string" ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ быстрСС.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ LC_ALL=C. Установка LC_ALL=C grep "pattern" file ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² 2–5 Ρ€Π°Π· быстрСС Π½Π° UTF-8 Ρ„Π°ΠΉΠ»Π°Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пропускаСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… символов.
  • Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ -r Π½Π° сСтСвых Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСмах. РСкурсивный grep Ρ‡Π΅Ρ€Π΅Π· NFS ΠΈΠ»ΠΈ CIFS ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΡ‹Ρ‚ΠΈΡ‚ΡŒ сСтСвой I/O. ВмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ find с -exec ΠΈ явным ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡƒΡ‚ΠΈ.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ --mmap Π² Linux. grep --mmap ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ вмСсто систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² read(), Ρ‡Ρ‚ΠΎ сниТаСт Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»Π°Ρ… (доступно Π½Π΅ Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…).
  • РаспараллСливайтС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ xargs -P. Для поиска Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… нСзависимых Ρ„Π°ΠΉΠ»Π°Ρ… Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ:
find /var/log -name "*.log" | xargs -P 4 grep -l "error"

Π­Ρ‚ΠΎ запускаСт 4 процСсса grep ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, задСйствуя нСсколько ядСр CPU.

grep Π² сравнСнии с Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ инструмСнтами поиска

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΡΡ…ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉΠ£Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ `.gitignore`Π›ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для
grepУмСрСннаяBRE/ERE/PCREНСтБистСмныС Ρ„Π°ΠΉΠ»Ρ‹, ΠΆΡƒΡ€Π½Π°Π»Ρ‹, скриптинг
ripgrep (rg)ΠžΡ‡Π΅Π½ΡŒ быстраяPCRE2Π”Π°ΠŸΠΎΠΈΡΠΊ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ Π² рСпозиториях
ag (Silver Searcher)БыстраяPCREΠ”Π°ΠŸΠΎΠΈΡΠΊ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ, Π±ΠΎΠ»Π΅Π΅ старая Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° rg
ackУмСрСннаяPCREΠ§Π°ΡΡ‚ΠΈΡ‡Π½ΠΎΠšΠΎΠ΄ΠΎΠ²Ρ‹Π΅ Π±Π°Π·Ρ‹, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° Perl
fgrep / grep -FБамая быстраяНСт (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹)НСтБканированиС ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΏΠΎ фиксированным строкам

Для Π·Π°Π΄Π°Ρ‡ систСмного администрирования β€” сканирования /var/log, /etc ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… процСссов β€” grep остаётся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ инструмСнтом, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ доступСн повсСмСстно Π±Π΅Π· установки. Для поиска Π² ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Ρ… Π±Π°Π·Π°Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ripgrep Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстрСС ΠΈ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы

Аудит Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ Π²Ρ…ΠΎΠ΄Π° ΠΏΠΎ SSH

grep -i "failed password" /var/log/auth.log | grep -oP "from K[d.]+" | sort | uniq -c | sort -rn | head -10

Π­Ρ‚ΠΎ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ исходный IP ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° ΠΏΠΎ SSH ΠΈ Ρ€Π°Π½ΠΆΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… ΠΏΠΎ частотС β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг Π² выявлСнии источников брутфорса ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ» брандмауэра.

Поиск ошибок ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ пСрСзапуском слуТбы

grep -rn "listens*443" /etc/nginx/

ΠŸΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Nginx ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ HTTPS-ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΠΈ. БовмСститС с настройкой SSL-сСртификатов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΊ сСртификатам, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² этих Ρ„Π°ΠΉΠ»Π°Ρ…, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚.

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Ρ„Π°ΠΉΠ»Π° ΠΆΡƒΡ€Π½Π°Π»Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

tail -f /var/log/app/production.log | grep --line-buffered "ERROR"

--line-buffered заставляСт grep ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки, Π° Π½Π΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ ΠΈΠ· tail -f. Π‘Π΅Π· этого Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΈΠ½ΡƒΡ‚, Π΄Π°ΠΆΠ΅ Ссли совпадСния происходят.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π°Π·Π²Ρ‘Ρ€Π½ΡƒΡ‚ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

grep -c "server_name" /etc/nginx/sites-enabled/* | grep -v ":0"

Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ список ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ сайта Nginx, содСрТащСго хотя Π±Ρ‹ ΠΎΠ΄Π½Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ server_name β€” быстрая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° работоспособности послС развёртывания Π½ΠΎΠ²ΠΎΠ³ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ хоста Π² срСдС VPS-хостинга.

Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ адрСсов элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

grep -Eo "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}" contacts.txt

Π€Π»Π°Π³ -o Π² сочСтании с шаблоном ERE ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ адрСса элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° строку, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΊ дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

Поиск Π² ΠΆΡƒΡ€Π½Π°Π»Π°Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… сСрвСрах

На Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ сСрвСрС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ нСсколько экзСмпляров ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ сопоставлСниС ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²:

grep -rh --include="*.log" "transaction_id=abc123" /var/log/app1/ /var/log/app2/ /var/log/app3/

-h подавляСт ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ Π² отсортированноС ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌ прСдставлСниС.

РаспространённыС ошибки ΠΈ способы ΠΈΡ… ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ

Π—Π°Π±Ρ‹Ρ‚Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Π²ΠΎΠΊΡ€ΡƒΠ³ шаблонов с ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ:

# Wrong β€” shell splits "connection refused" into two arguments
grep connection refused /var/log/syslog

# Correct
grep "connection refused" /var/log/syslog

ИспользованиС синтаксиса BRE Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π½ΡƒΠΆΠ΅Π½ ERE:

# Wrong in BRE β€” + is literal
grep "error+" app.log

# Correct β€” use -E or escape in BRE
grep -E "error+" app.log
grep "error+" app.log

РСкурсивный поиск, Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹:

# Produces "Binary file matches" noise
grep -r "config" /usr/

# Correct β€” skip binary files
grep -r --binary-files=without-match "config" /usr/
# or equivalently
grep -rI "config" /usr/

ΠŸΡƒΡ‚Π°Π½ΠΈΡ†Π° с якорями β€” ^ Π²Π½ΡƒΡ‚Ρ€ΠΈ класса символов:

[^abc] ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«Π½Π΅ a, b ΠΈΠ»ΠΈ cΒ». ^ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«Π½Π°Ρ‡Π°Π»ΠΎ строки» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° стоит Π² самом Π½Π°Ρ‡Π°Π»Π΅ шаблона, Π²Π½Π΅ скобок.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Π²Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° принятия Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ этот ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список ΠΏΡ€ΠΈ составлСнии ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ grep:

  • Π›ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Π°Ρ строка, рСгулярныС выраТСния Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹? Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -F для максимальной скорости.
  • НСизвСстный рСгистр Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅? Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -i.
  • НуТно Π·Π½Π°Ρ‚ΡŒ, Π³Π΄Π΅ Π² Ρ„Π°ΠΉΠ»Π΅ находится совпадСниС? Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -n.
  • Поиск ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²? Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -r --include="*.ext" для ограничСния области поиска.
  • Π‘ΠΎΠ»ΡŒΡˆΠΎΠΉ Ρ„Π°ΠΉΠ», Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅? Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -m 1 ΠΈ grep Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ совпадСния.
  • НуТСн ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΠΉ контСкст для диагностики? Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -C 3.
  • Π¨Π°Π±Π»ΠΎΠ½ содСрТит мСтасимволы ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ? Π—Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ шаблон Π² ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ: grep '$variable'.
  • Поиск Π² сТатых ΠΆΡƒΡ€Π½Π°Π»Π°Ρ…? Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ zgrep ΠΈΠ»ΠΈ zcat file.gz | grep.
  • НуТны Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΊΠ²Π°Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ +/?? Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -E для ERE.
  • НуТны ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΠ»ΠΈ Π½Π΅ΠΆΠ°Π΄Π½ΠΎΠ΅ сопоставлСниС? Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -P для PCRE (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ GNU grep).
  • Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ тСкста, Π° Π½Π΅ Ρ†Π΅Π»Ρ‹Ρ… строк? Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ -o.
  • Поиск Π² ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅, Π° Π½Π΅ Π² систСмных Ρ„Π°ΠΉΠ»Π°Ρ…? РассмотритС ripgrep вмСсто этого.

ΠŸΡ€ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ сСрвСрной инфраструктурой β€” Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ VPS с cPanel ΠΈΠ»ΠΈ чистая срСда Linux β€” grep являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ инструмСнтом, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. УсвоСниС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Ρ„Π»Π°Π³ΠΎΠ² ΠΈ возмоТности ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ с awk, sed, sort ΠΈ xargs ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π² ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Π΄ΠΈΠ°Π³Π½ΠΎΡΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π·Π° считанныС сСкунды.

Для срСд, Π³Π΄Π΅ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΉ хостинг ΠΈΠ»ΠΈ Π²Π΅Π±-прилоТСния Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ структурированныС ΠΆΡƒΡ€Π½Π°Π»Ρ‹ с большим ΠΎΠ±ΡŠΡ‘ΠΌΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, СстСствСнным ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом являСтся сочСтаниС grep с ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΎΠΌ Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² (стСк ELK, Loki ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ) β€” ΠΎΠ΄Π½Π°ΠΊΠΎ grep остаётся запасным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π΅Π·Π΄Π΅, всСгда ΠΈ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ зависимостСй.

Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы

Π’ Ρ‡Ρ‘ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ grep, egrep ΠΈ fgrep?

grep ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ рСгулярныС выраТСния. egrep эквивалСнтСн grep -E ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ рСгулярныС выраТСния, Π³Π΄Π΅ +, ?, | ΠΈ () Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π±Π΅Π· ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… косых Ρ‡Π΅Ρ€Ρ‚. fgrep эквивалСнтСн grep -F ΠΈ Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΠ΅Ρ‚ шаблон ΠΊΠ°ΠΊ Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½ΡƒΡŽ строку Π±Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ самым быстрым Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ. Оба egrep ΠΈ fgrep ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ псСвдонимами; ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ grep -E ΠΈ grep -F Π² скриптах.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ grep -r ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Β«Binary file matchesΒ»?

grep опрСдСляСт Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡƒΡ‚Ρ‘ΠΌ сканирования Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ². Когда ΠΎΠ½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ совпадСниС Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ считаСт Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ, вмСсто ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΉ строки выводится это сообщСниС. ΠŸΠΎΠ΄Π°Π²ΠΈΡ‚Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ grep -rI (заглавная I) ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ тСкстовый Ρ€Π΅ΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ grep -ra (ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠ°ΠΊ тСкст). Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ -I Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ срСдС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ искаТённого Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€ΠΈ случайном совпадСнии с скомпилированными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ сТатыми Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ.

Как Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск шаблона, содСрТащСго ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊΠΎΡΡƒΡŽ Ρ‡Π΅Ρ€Ρ‚Ρƒ?

ΠŸΡ€ΡΠΌΡ‹Π΅ косыС Ρ‡Π΅Ρ€Ρ‚Ρ‹ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ… grep (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ sed ΠΈΠ»ΠΈ awk). Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ: grep "var/log" /etc/logrotate.conf. Π­ΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ трСбуСтся.

Каков самый быстрый способ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, сущСствуСт Π»ΠΈ строка Π³Π΄Π΅-Π»ΠΈΠ±ΠΎ Π² большом Ρ„Π°ΠΉΠ»Π΅?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ grep -qF "string" file && echo "found". Π€Π»Π°Π³ -q подавляСт вСсь Π²Ρ‹Π²ΠΎΠ΄ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ со статусом 0 ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ совпадСнии, 1 β€” Ссли совпадСний Π½Π΅Ρ‚. Π€Π»Π°Π³ -F ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π’ совокупности grep Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Π°, сколько Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ β€” это критичСски Π²Π°ΠΆΠ½ΠΎ для Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π² Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Ρ‹.

ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ grep Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ поиск Π² Ρ„Π°ΠΉΠ»Π°Ρ… Π½Π° ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΌ сСрвСрС Π±Π΅Π· ΠΈΡ… локального копирования?

Π”Π°. ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ‡Π΅Ρ€Π΅Π· SSH: ssh user@host "grep -r 'pattern' /var/log/". Поиск выполняСтся Π½Π° ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΌ хостС, ΠΈ ΠΏΠΎ сСти ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ строки. Для рСгулярных поисков рассмотритС ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ sshfs ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ запуск grep, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для вСдСния ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ², Ссли ΠΎΠ±ΡŠΡ‘ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΡ€Π°Π²Π΄Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΡƒΡŽ инфраструктуру.