Grep все, що можна

Про
grep
знають якщо не всі, то багато читачів Хабра, проте його численних родичів знають небагато.

Давайте дізнаємося, як можна грепать все, що таїть в собі хоч крихту тексту.
pgrep
Команда
pgrep
грепает список виконуваних процесів.
(5:573)$
pgrep bash
1772
11003
20678

З ключем
a
, команда також видасть всю командний рядок.
(5:574)$
pgrep -af bash
1772 -bash
11003 /bin/bash
20678 /bin/bash
23567 -bash

Якщо правильно комбінувати
ps
та
psgrep
, то результат буде мабуть зручніше, ніж
ps -ef |grep process_name
, так як не містить саму команду
grep
.
(5:575)$ ps wup $(pgrep bash)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1772 0.0 0.0 21572 3020 tty1 S+ ноя19 0:00 -bash
user 11003 0.0 0.0 21384 3772 pts/3 Ss ноя28 0:00 /bin/bash
user 20678 0.0 0.0 21396 3604 pts/1 Ss+ ноя24 0:00 /bin/bash
root 23567 0.0 0.0 21364 3016 tty2 S+ ноя21 0:00 -bash
946/7720MB 0.48 0.94 1.00 1/352 20403

zipgrep, zfgrep, bzfgrep, xzfgrep
Можна шукати ключове слово, патерн безпосередньо з архіву за допомогою цих команд.
(5:576)$ zipgrep -i exception apptrace.zip
jboss.stderr:java.lang.NumberFormatException: For input string: "4718-4e99-bc84-828a7bf7f254"
jboss.stderr: at java.lang.NumberFormatException.(NumberFormatException.java:65)
(5:576)$
(5:576)$ bzfgrep -w bugs /usr/share/doc/coreutils-8.25/README.bz2
that distribution and found and reported bugs.
<http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/12292/focus=12318>.
see <http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/12015/>.
Reporting bugs:
subtle bugs.
When reporting bugs, please include in the subject line both the package

Утиліти підтримують розширені регулярні вирази і мають свій аналог
egrep
.






Fixed Strings Basic RegExps Extended RegExps zfgrep zgrep zegrep bzfgrep bzgrep bzegrep xzfgrep xzgrep xzegrep
Яким пакетах вони належать?
(5:777)$ equery belongs $(which zgrep zipgrep bzgrep xzgrep)
* Searching for /usr/bin/zgrep,/usr/bin/zipgrep,/usr/bin/bzgrep,/usr/bin/xzgrep ... 
app-arch/bzip2-1.0.6-r7 (/usr/bin/bzgrep)
app-arch/gzip-1.8 (/usr/bin/zgrep)
app-arch/unzip-6.0_p20 (/usr/bin/zipgrep)
app-arch/xz-utils-5.2.2 (/usr/bin/xzgrep)

Порівнюємо з
grep
здатність парсити розширені регулярки і радіємо результату.
(5:578) grep -oE '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b' /var/log/emerge.log |tail -n 3
7.2.6.8
213.180.204.183
213.180.204.183
(5:579)
(5:579) bzegrep -o '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b' /tmp/emerge.log.bz2 |tail -n3
7.2.6.8
213.180.204.183
213.180.204.183

pdfgrep
Програма йде з однойменною пакетом.
(5:580)$ eix pdfgrep
[I] app-text/pdfgrep
Доступні версії: 1.3.2 1.4.1-r1 {+pcre test unac}
Встановлені версія: 1.4.1-r1(14:10:46 29.11.2016)(pcre -test -unac)
Домашня сторінка: http://pdfgrep.org/
Опис: A tool similar to grep which searches text in PDFs

Команда парсити pdf файли і робить все те, що належить
grep
.
(5:581)$ pdfgrep -i outdiscards ebook/linux_netw.pdf 
IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTDISCARDS);

Pdfgrep
не підтримує розширені регулярні вирази, тим не менше це дуже корисна програма. Я досить часто відкриваю pdf-ки і шукаю в них текст, поки не згадаю в якій книзі було те, що мені потрібно і так втрачаю силу-силенну часу. Тепер буду знати.
dgrep
Дебианщикам може бути знаком
dgrep
, який йде з пакетом debian goodies. Команда викликається так само як і звичайний
grep
, тільки замість файлу вказується назва пакету.







Fixed Strings Basic RegExps Extended RegExps dfgrep dgrep degrep - dzgrep -
Верхні три шукають в текстових файлах, а
dzgrep
— в архівних.
msggrep, mboxgrep
Це вже зовсім вузько спеціалізована штуковина, щоб парсити каталоги локалізації. Йде в комплекті з пакетом gettext. Програма не з розряду користувача, але якщо дуже потрібно, можна запустити з командного рядка.
(5:752)$ msggrep -K -e help /usr/share/locale/uk/cups_ru.po

І отримати такий висновок на екран
msgid ""
msgstr ""
"Project-Id-Version: CUPS 2.0\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
"POT-Creation-Date: 2015-07-20 14:24-0400\n"
"PO-Revision-Date: 2015-01-28 12:00-0800\n"
"Last-Translator: Aleksandr Proklov\n"
"Language-Team: PuppyRus Linux Team\n"
"Language: Ukrainian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid " --help Show help."
msgstr " --help Показати довідку."

msgid " --help Show this help."
msgstr " --help Показати цю довідку."

Наступний експонат — парсер поштових скриньок mboxgrep. Проект так і не злетів, його розробка припинена. По ідеї він повинен був знаходити патерни в листах і обробляти висновок так як ніби це окремі файли. Проте, для початку він ці патерни повинен вміти знаходити.
(5:753)$ grep Inomics docs/PocoMail.bak/Mail/Trash.mbx
From: Inomics <inomics-alert@inomics.com>
Reply-To: Inomics <inomics-alert@inomics.com>
Subject: Inomics Alert Service
following is a list of new job openings in Inomics, the=
Inomics!
You can always unsubscribe from the Inomics Job Alert service by=
plying to this mail with the words "Inomics-Job-Unsub#1avwnr55di"=

А він не знаходить.
(5:754)$ mboxgrep Inomics docs/PocoMail.bak/Mail/Trash.mbx
(5:755)$

Що дивно, системні виклики
read
весь час одні і ті ж, незалежно від пошуку.
(5:779)$ strace -e trace=read -o strace_inomics mboxgrep Inomics Mail/Trash.mbx
(5:780)$ strace -e trace=read -o strace_freenet mboxgrep freenet Mail/Trash.mbx
(5:781)$ diff strace_inomics strace_freenet;md5sum strace_*
14b7de546a2a776006ad2a6440b680fd strace_freenet
14b7de546a2a776006ad2a6440b680fd strace_inomics

Цікаво було б дізнатися, завелася ця програма успішно у кого-небудь?
Ну гаразд, ми захопилися, а греп сімейство ще не інвентаризоване повністю.
ssgrep
Потрібно встановити пакет Gnumeric. Вміє шерстити електронні таблиці, у тому числі пропріетарний Excel формат. Свариться на нього, але робить.
(5:782)$ ssgrep Date files/*.xlsx
Невизначений індикатор числового формату "43"
Невизначений індикатор числового формату "41"
Невизначений індикатор числового формату "44"
Невизначений індикатор числового формату "42"
Unexpected element 'workbookProtection' in state: workbook
Дата народження/Date of Birth
(5:783)$ grep Date files/*.xlsx
(5:784)$

Розширені регулярні вирази не підтримує. Цілком корисна штука, рекомендую.
ngrep
покинутий проект на SourceForge. Програма представляє з себе гібрид
tcpdump
та
grep
, причому до першого набагато ближче, ніж до другого.
Спостереження за мережевим трафіком по порту
syslog
та ключовому слову.
$ ngrep -d any 'error' port syslog

Спостереження за мережевим трафіком по порту
ftp
та ключовими словами без урахування регістру, порівнювати слова цілком.
$ ngrep -wi -d any 'user|pass' port 21

По-рядковий висновок
http
трафіку.
$ ngrep -W byline port 80
interface: eth0 (64.90.164.72/255.255.255.252)
filter: ip and ( port 80 )
####
T 67.169.59.38:42177 -> 64.90.164.74:80 [AP]
GET / HTTP/1.1.
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686) Opera ...
Host: www.darkridge.com.
Accept: text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9 ...
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1.
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0.
Cookie: SQMSESSID=5272f9ae21c07eca4dfd75f9a3cda22e.
Cookie2: $Version=1.
Cache-Control: no-cache.
Connection: Keep-Alive, TE.
TE: deflate, gzip, chunked, identity, trailers.

А ще є кілер-фіча. Можна задати hex рядок, якої
ngrep
зіставляє двійкові дані пакета. Наприклад, можна задати сигнатуру завирусованной гифки, щоб потім налаштувати файрвол на раннє виявлення.
$ ngrep -xX '0xc5d5e5f55666768696a6b6c6d6e6' port 80
interface: eth0 (64.90.164.72/255.255.255.252)
filter: ip and ( port 80 )
match: 0xc5d5e5f55666768696a6b6c6d6e6

Шкода, що розробка проекту припинено, може в підсумку вийти цілком придатний самоворо-паровозо-вертоліт аналізатор і аналізатор мережевого трафіку.
deepgrep
Під кінець можна пом'янути не-юниксвейные агрегати пошуку, такі як
deepgrep
KDE strigi-utils.
Програма вміє шукать шукати в файлах формату:
  • tar
  • ar
    /
    deb
  • a
    (але не
    cpio
    )
  • gzip/gz
  • bzip2/bz2
  • zip
    , а значить і jar/war а також документи OpenOffice.org/LibreOffice
  • MIME повідомлення (тобто прикріплені файли у емайле)
Вміє шукати в архівах, вкладених один в одного.
$ deepgrep foo bar.ar
foo.ar/foo.tar/foo.tar.gz/foo.zip/foo.tar.bz2/foo.txt.gz/foo.txt:foobar
foo.ar/foo.tar/foo.tar.gz/foo.zip/foo.tar.bz2/foo.txt.gz/foo.txt:bar

З недоліків.
  • Практично відсутні опції командного рядка.
  • Погано документована.
  • Код повернення ніяк не пов'язаний з результатом пошуку.
  • Відсутня підтримка стиснення з використання LZMA алгоритму:
    lzma, xz, lzip, 7z
    , а також
    lzop, rzip, cab. cpio, xar, rar, .Z
    формати.
Використані матеріали
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.