Како да ја користите командата grep на Linux
Командата за Linux grep
е алатка за совпаѓање низа и шаблони што прикажува соодветни линии од повеќе датотеки. Работи и со цевководен излез од други команди. Ви покажуваме како.
Приказната зад гр
Командата grep
е позната во круговите на Linux и Unix поради три причини. Прво, тоа е неверојатно корисно. Второ, богатството на опции може да биде огромно. Трето, напишано е преку ноќ за да се задоволи одредена потреба. Првите две се тресне; третиот е малку исклучен.
Кен Томпсон ги извлече можностите за пребарување на редовните изрази од уредникот ed
(се изговара ee-dee) и создаде мала програма - за своја сопствена употреба - за пребарување низ текстуални датотеки. Неговиот шеф на одделот во Bell Labs, Даг Мекилрој, му пришол на Томпсон и го опишал проблемот со кој се соочувал еден од неговите колеги, Ли Мекмахон.
Мекмахон се обидуваше да ги идентификува авторите на федералистичките трудови преку текстуална анализа. Му требаше алатка која може да бара фрази и низи во текстуални датотеки. Томпсон потроши околу еден час таа вечер правејќи ја својата алатка општа алатка што може да ја користат другите и ја преименува во grep
. Тој го зеде името од низата наредби ed
g/re/p
, што се преведува како „глобално пребарување на регуларни изрази“.
Можете да го гледате Томпсон како разговара со Брајан Керниган за раѓањето на grep
.
Едноставни пребарувања со grep
За да пребарувате низа во датотека, пренесете го терминот за пребарување и името на датотеката на командната линија:
Се прикажуваат линии кои одговараат. Во овој случај, тоа е една линија. Текстот што одговара е означен. Тоа е затоа што на повеќето дистрибуции grep
е алијас на:
alias grep='grep --colour=auto'
Ајде да ги погледнеме резултатите каде што има повеќе линии што се совпаѓаат. Ќе го бараме зборот „Просечно“ во датотеката за дневник на апликацијата. Бидејќи не можеме да се потсетиме дали зборот е со мали букви во датотеката за евиденција, ќе ја користиме опцијата -i
(игнорирај букви):
grep -i Average geek-1.log
Се прикажува секоја линија што одговара, а во секоја е означен соодветниот текст.
Можеме да ги прикажеме линиите што не се совпаѓаат со користење на опцијата -v (инвертирај совпаѓање).
grep -v Mem geek-1.log
Нема истакнување бидејќи тоа се линиите што не се совпаѓаат.
Можеме да предизвикаме grep
да биде целосно тивок. Резултатот се пренесува на школката како повратна вредност од grep
. Резултатот од нула значи дека низата беше пронајдена, а резултатот од еден значи дека не е пронајдена. Можеме да го провериме повратниот код користејќи ги специјалните параметри $?
:
grep -q average geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?
Рекурзивни пребарувања со grep
За да пребарувате низ вгнездени директориуми и поддиректориуми, користете ја опцијата -r (рекурзивна). Забележете дека не давате име на датотека на командната линија, мора да наведете патека. Овде бараме во тековниот директориум . и сите поддиректориуми:
grep -r -i memfree .
Излезот ги вклучува директориумот и името на датотеката на секоја линија што одговара.
Можеме да направиме grep
да следи симболични врски со користење на опцијата -R
(рекурзивна дереференција). Имаме симболична врска во овој директориум, наречена папка за дневници
. Посочува на /home/dave/logs
.
ls -l logs-folder
Да го повториме нашето последно пребарување со опцијата -R
(рекурзивна дереференција):
grep -R -i memfree .
Симболичката врска се следи и директориумот на кој укажува се пребарува и од grep
.
Барање цели зборови
Стандардно, grep
ќе одговара на линија ако целта за пребарување се појавува каде било во таа линија, вклучително и во друга низа. Погледнете го овој пример. Ќе го бараме зборот „бесплатно“.
grep -i free geek-1.log
Резултатите се линии кои ја имаат низата „слободна“ во нив, но тие не се посебни зборови. Тие се дел од низата „MemFree“.
За да го принудите grep
да одговара само на одделни „зборови“, користете ја опцијата -w
(регексп на зборот).
grep -w -i free geek-1.log
echo $?
Овој пат нема резултати бидејќи терминот за пребарување „бесплатно“ не се појавува во датотеката како посебен збор.
Користење на повеќе термини за пребарување
Опцијата -E
(продолжен регексп) ви овозможува да пребарувате повеќе зборови. (Опцијата -E
ја заменува застарената верзија egrep
на grep
.)
Оваа команда бара два поима за пребарување, „просечно“ и „мембесплатно“.
grep -E -w -i "average|memfree" geek-1.log
Сите линии што се совпаѓаат се прикажани за секој од поимите за пребарување.
Можете исто така да пребарувате за повеќе поими кои не се нужно цели зборови, но може да бидат и цели зборови.
Опцијата -e
(шеми) ви овозможува да користите повеќе изрази за пребарување на командната линија. Ја користиме функцијата заграда за редовни изрази за да создадеме шема за пребарување. Му кажува на grep
да одговара на кој било од знаците содржани во заградите „[]. Ова значи дека grep
ќе одговара на „kB“ или „KB“ додека пребарува.
И двете низи се совпаѓаат и, всушност, некои линии ги содржат двете низи.
Точно совпаѓање на линиите
-x
(линија regexp) ќе одговара само на линиите каде што целата линија се совпаѓа со терминот за пребарување. Ајде да бараме печат за датум и време за кој знаеме дека се појавува само еднаш во датотеката за евиденција:
grep -x "20-Jan--06 15:24:35" geek-1.log
Се наоѓа и прикажува единствената линија што се совпаѓа.
Спротивно на тоа е само прикажување на линиите што не се совпаѓаат. Ова може да биде корисно кога гледате конфигурациски датотеки. Коментарите се одлични, но понекогаш е тешко да се забележат вистинските поставки меѓу сите нив. Еве ја датотеката /etc/sudoers
:
Можеме ефективно да ги филтрираме линиите за коментари вака:
sudo grep -v "#" /etc/sudoers
Тоа е многу полесно да се анализира.
Се прикажува само совпаѓачки текст
Може да има прилика кога не сакате да ја видите целата линија што одговара, само текстот што се совпаѓа. Опцијата -o
(само што се совпаѓа) го прави токму тоа.
grep -o MemFree geek-1.log
Приказот е намален на прикажување само на текстот што одговара на терминот за пребарување, наместо целата линија што одговара.
Броење со греп
grep
не е само текст, туку може да обезбеди и нумерички информации. Можеме да направиме grep
да ни смета на различни начини. Ако сакаме да знаеме колку пати терминот за пребарување се појавува во датотека, можеме да ја користиме опцијата -c
(count).
grep -c average geek-1.log
grep
известува дека терминот за пребарување се појавува 240 пати во оваа датотека.
Можете да направите grep
да го прикажува бројот на линијата за секоја линија што одговара со користење на опцијата -n
(број на линија).
grep -n Jan geek-1.log
Бројот на линијата за секоја линија што одговара се прикажува на почетокот на линијата.
За да го намалите бројот на прикажани резултати, користете ја опцијата -m
(max count). Ќе го ограничиме излезот на пет линии што се совпаѓаат:
grep -m5 -n Jan geek-1.log
Додавање контекст
Често е корисно да имате можност да видите некои дополнителни линии - можеби линии што не се совпаѓаат - за секоја линија што одговара. може да помогне да разликувате кои од поклопените линии се оние за кои ве интересира.
За да прикажете неколку линии по линијата што одговара, користете ја опцијата -A (по контекст). Бараме три линии во овој пример:
grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log
За да видите некои линии од пред линијата што одговара, користете ја опцијата -B
(контекст пред).
grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log
И за да вклучите линии од пред и по линијата што одговара, користете ја опцијата -C
(контекст).
grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log
Прикажани датотеки што се совпаѓаат
За да ги видите имињата на датотеките што го содржат терминот за пребарување, користете ја опцијата -l
(датотеки со совпаѓање). За да дознаете кои датотеки со изворниот код C содржат референци до датотеката за заглавие sl.h
, користете ја оваа команда:
grep -l "sl.h" *.c
Имињата на датотеките се наведени, а не линиите што се совпаѓаат.
И, се разбира, можеме да бараме датотеки што не го содржат терминот за пребарување. Опцијата -L
(датотеки без совпаѓање) го прави токму тоа.
grep -L "sl.h" *.c
Почеток и крај на линиите
Можеме да го принудиме grep
да прикажува само совпаѓања што се или на почетокот или на крајот на линијата. Операторот со регуларен израз „^“ се совпаѓа со почетокот на линијата. Практично сите линии во датотеката за евиденција ќе содржат празни места, но ние ќе бараме линии што имаат празно место како прв знак:
grep "^ " geek-1.log
Се прикажуваат линиите што имаат празно место како прв знак - на почетокот на линијата.
За да одговарате на крајот на линијата, користете го операторот со регуларен израз „$“. Ќе бараме линии што завршуваат со „00“.
grep "00$" geek-1.log
На екранот се прикажуваат линиите кои имаат „00“ како нивни последни знаци.
Користење на цевки со grep
Се разбира, можете да го внесете влезот во grep
, да го внесете излезот од grep
во друга програма и да имате grep
сместено во средината на цевката синџир.
Да речеме дека сакаме да ги видиме сите појави на низата „ExtractParameters“ во датотеките со изворниот код C. Знаеме дека ќе има неколку, па го внесуваме излезот во less
:
grep "ExtractParameters" *.c | less
Излезот е претставен во less
.
Ова ви овозможува да страницата низ списокот со датотеки и да ја користите lesss
алатката за пребарување.
Ако го внесеме излезот од grep
во wc
и ја користиме опцијата -l
(линии), можеме да го броиме бројот на линии во изворот код датотеки кои содржат „ExtractParameters“. (Ова би можело да го постигнеме со помош на опцијата grep
-c
(count), но ова е уреден начин да се демонстрира извлекувањето на цевки од grep
.)
grep "ExtractParameters" *.c | wc -l
Со следната команда, го внесуваме излезот од ls
во grep
и го ставаме излезот од grep
во sort
. Ги наведуваме датотеките во тековниот директориум, ги избираме оние со низата „Август“ во нив и ги подредуваме според големината на датотеката:
ls -l | grep "Aug" | sort +4n
Да го растуриме тоа:
- ls -l: Изведете список на датотеки со долг формат користејќи
ls
. - grep „август“: изберете ги линиите од списокот
ls
што имаат „август“ во нив. Имајте предвид дека ова ќе најде и датотеки што имаат „август“ во нивните имиња. - сортирање +4n: Подреди го излезот од grep на четвртата колона (големина на датотеката).
Добиваме сортиран список на сите датотеки модифицирани во август (без разлика на годината), по растечки редослед на големината на датотеката.
grep: Помалку команда, повеќе сојузник
grep
е одлична алатка што треба да ја имате на располагање. Датира од 1974 година и сè уште е силно бидејќи ни треба она што го прави, а ништо не го прави подобро.
Спојувањето на grep
со некои регуларни изрази-fu навистина го носи на следното ниво.
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts