Emacs - editorul zeilor

March 8th, 2009 Alex

Am fost Joi la Wurbe #18 și am ținut o prezentare despre Emacs.

Nu a fost prea reușită … n-am mai ținut prezentări până acum și m-am cam emoționat :) … încurcându-mă în prezentare am uitat de aspecte importante despre care ar fi trebuit să vorbesc, și am lăsat pe afară alte câteva plugin-uri foarte cool. Plus că am uitat de partea cea mai importantă … resurse de învățare.

Data viitoare o să vin mai bine pregătit :)

Resurse Emacs

Pentru început:

Plugin-urile prezentate:

  • Yasnippets … cu un articol introductiv scris pe celălat blog
  • ISpell și FlySpell (module incluse în distribuție) … integrare cu ispell/aspell ce permite corecția textului în mai multe limbi, inclusiv în română
  • Flymake (modul inclus în distribuție) … ce permite raportarea de erori sintactice în real time, independent de limbajul de programare
  • cperl-mode (inclus în distribuție) … mod editare inteligent de Perl, cu syntax highlighting bine făcut, integrare cu perldoc, și integrare cu Grand Unified Debugger din Emacs
  • python-mode (inclus în distribuție) … modul de Python inteligent, cu debugger integrat cu GUD și interpretor interactiv

Funcționalități care ar fi trebuit să le menționez:

Și bineînțeles … configurația mea de Emacs.

De ce nu Eclipse, Visual Studio, etc…?

Pe vremea când foloseam Eclipse, chiar încercam să-mi placă. Îmi plăcea ideea că este extensibil și că de voie de nevoie are o comunitate, și promite să fie un Visual Studio pentru Linux/Mac OS X.

Dar sunt genul de om ce experimentează cu diverse tehnologii și limbaje de programare destul de „cutting edge”, iar plugin-urile de Eclipse sunt mereu la câteva buguri departe de pragul în care încep a fi funcționale. Și pentru a începe lucrul cu orice limbaj, n-ai nevoie decât de syntax highlighting … atât. Și nici un IDE nu are integrare reală cu alte unelte, fiind monolitice și destul de departe de filozofia Unix.

Și un IDE pe termen lung nu te ajută deoarece din motive greu de prevăzut îți dictează arhitectura aplicației, și influențează întreaga cultură din jurul tehnologiilor suportate, făcând posibile aberații ale naturii, cum ar fi …

BufferedReader in = new BufferedReader(
    new InputStreamReader(
    new FileInputStream("file.txt"), "UTF-8"));

… idee exprimată ceva mai bine în Does Visual Studio Rot the Mind? (Charles Petzold … unul dintre cei mai cunoscuți editori pe tehnologii Microsoft).

Iar pentru o comparație de perspectivă dintre cele două lumi … o diferență între System.Shell.CommandLine și Mono.Options, discuție care n-ar exista dacă System.Shell.CommandLine n-ar fi gândit pentru utilizarea într-un IDE de programatori mediocrii (din fericire se pare că nu vor include totuși System.Shell.CommandLine în următorul preview).

Plus că trebuie să aștepți deschiderea aplicației cam cât îți ia să citești acest articol ;)

De ce Emacs?

Nu cred că pot răspunde prea bine, este mai mult vorba de un sentiment pe care-l simți odată ce reușești să devi familiar cu mediul.

Emacs și Vim sunt două unelte foarte interesante, comparate cu IDE-urile clasice. Nu oferă prea ușor intellisense, n-au interfață de design a interfețelor grafice, și de fapt nu au interfață point&click. Asta nu înseamnă că nu te ajută, departe de asta. Și pentru a lucra eficient, ai nevoie de ceva timp de studiu, și deoarece sunt atât de diferite de mediile tradiționale tranziția este dureroasă.

Munca fizică efectivă a oricărui programator este citirea/generarea/editarea de texte. Cu toate astea instrumentele clasice nu sunt eficiente pentru editare. Este ca diferența între un chirurg ce folosește un bisturiu ascuțit, și un chirurg (al viitorului) ce folosește un roboțel programat din fabrică pentru anumite operații. Esta ca diferența între un set de Lego tematic din care poți construi doar o corabie cu pirați, și unul format doar din cărămizi de diverse forme :)

Lumea a devenit mult prea obsedată de ușurință în folosire, de rezultate rapide, de „instant gratification”. Cu toate astea profesioniștii din alte domenii merg într-o direcție diferită … n-o să auzi de la un chirurg că și-a luat licența fără ani buni de studiu, n-o să auzi de la un pilot de curse că folosește cutie de viteze automată, n-o să auzi de la nici un artist sau sportiv bun că a ajuns unde a ajuns fără o cantitate de efort aproape ireal.

Am exprimat în mare aceeași idee în Obsesie pentru limbaj, de unde și citatul …

The clumsiness of people who have to engage their brain at every step is unbearably painful to watch, at least to me, and that’s what the novice-friendly software makes people do, because there’s no elegance in them, it’s just a mass of features to be learned by rote. However, this suits people a hell of a lot better than setting out at age 6 to become a great ballet dancer and achieving their goal 20 years later after every tendon and muscle and joint has been asked to perform just a little bit more than nature ever intended over and over and over again. To most people, this is insanity. But in reality, it’s art, and it’s the art in what we do that makes us human.

Erik Naggum, Usenet article

Așa că aveți răspunsul … Emacs este pentru artiști. Știu că pare a fi o atitudine arogantă, dar în Emacs simplul fapt că orice acțiune și comportament poate fi controlat din eLisp, simpla idee că-ți poți controla mediul în orice chip imaginabil, și că nu ești limitat de un wizard grafic al cărui rezultat este bătut în cuie … este o idee periculoasă în industria noastră. Asta înseamnă că-ți poți controla mediul, că nu ești o comoditate debarasabilă, că vei putea concura de unul singur cu hale întregi de programatori ieftini ;)

Enjoy ~

Posted in passion, technology, unix | 5 Comments »

Emacs, editorul programabil

May 10th, 2008 Alex

De ceva timp am început să fac tranziția de la Vim la Emacs. Știu, știu, cum aș putea? :)

Se poate pune întrebarea, de ce-mi creez atâtea probleme? Adică nu este de ajuns Notepad, sau orice editor de texte?

Într-adevăr, dacă programatorii ar gândi mai mult și ar scrie mai puțin cod, probabil lumea ar fi mai bună :) Dar pentru a putea gândi mai mult, trebuie să înlăturăm complexitatea accidentală (despre complexitate accidentală vezi No Silver Bullet). Programarea, pe lângă creativitate, mai presupune și muncă brută, și la fel ca marii atleți, programarea efectivă (i.e. procesul de comunicare cu calculatorul) trebuie să devină o activitate pe care o faci din reflex (fără să te gândești, la fel ca mersul pe bicicletă).

Use a Single Editor Well
The editor should be an extension of your hand; make sure your editor is configurable, extensible, and programmable.

Pragmatic Programmer

Majoritatea timpului programarea se reduce la editarea de texte (cod, specs, email-uri între membrii echipei, merge de branch-uri, etc…), ai un avantaj destul de mare dacă ai un editor de texte puternic și adaptabil la orice nevoi. Și deși Eclipse este un IDE respectabil cu extrem de multe plugin-uri, chiar nu se compară la flexibilitate și eficiență, ca să nu mai vorbesc de resursele imense folosite. Vim este un prieten vechi, și din punct de vedere al editării de texte, este cel mai eficient editor. Nu cred că voi renunța însă niciodată la vim, mai ales că prezența unui editor compatibil vi este cerință în standardul Posix, iar Vim este prezent pe orice server cu care am interacționat vreodată.

Dar Emacs este cu totul altceva, și sincer să fiu, este greu de explicat de ce Emacs este ceea ce este. Deși este vechi de vreo 25 de ani, pot pune pariu că este singurul mediu de dezvoltare ce încă va fi relevant și peste 100 de ani de acum încolo.

Nu totul este perfect, și pentru un exemplu concret, în Emacs este destul de greu să definești un mod de editare pentru un limbaj de programare nou, fără să ai experiență serioasă cu Emacs Lisp, și există destul de puține limbaje de programare pentru care există suport pentru intellisense și pentru refactoring (până acum știu de Lisp, Java, Python, și în curând Javascript). Comparativ cu Textmate, unde editarea unui bundle este extrem de ușoară datorită unei abstractizări metalingvistice destul de reușite (deși pentru Textmate nu știu deocamdată de nici un limbaj cu suport de intellisense și de refactoring).

Tranziția la Emacs chiar nu este ușoară, și nici nu știu sigur dacă va reuși, dar o iau foarte în serios, și oricum, drept consolare a unei eventuale nereușite cel puțin Emacs Lisp este al naibii de cool ;) Și deja am început să mă gândesc la lucruri ce-mi lipsesc și să le implementez de unul singur. De exemplu îmi lipsește din Eclipse fereastra de Open Resource, ce-ți permite să cauți după wildcards nume de fișiere din proiect, și mi-am implementat o funcționalitate aproape echivalentă în emacs.

Pluginul l-am făcut public … open-resource.el

Este foarte simpluț, dar plănuiesc să-i adaug funcționalități ulterioare … cum ar fi o listă de sugestii în timp ce tastezi, sau să facă cautare și prin CTags de exemplu.

Posted in emacs, technology, unix | 8 Comments »

Lock-in tehnologic … being evil

April 22nd, 2008 Alex

După cum am mai menţionat, la servici folosesc Mac OS X, şi-l folosesc în principiu deoarece Linux nu este un “first-class citizen” în Adobe (deşi aparent situaţia se schimbă, în bine), dar trebuie să recunosc că-mi place şi MacBook-ul şi nu prea mă încântă perspectiva folosirii unui Levono Thinkpad (yuck). Am în schimb instalată o maşină virtuală Ubuntu, şi ferestrele aplicaţiilor din maşina virtuală îmi rulează direct în desktop-ul Mac OS, thanks to XWindows.

Din păcate însă, deşi produsul la care lucrăm are ca ţintă de deployment Linux, restul colegilor folosesc Windows, fără Cygwin.

Eh, ei nu ştiu ce pierd. Culmea este că se confruntă zilnic cu probleme de genul … hei, cum pot compila libxml pentru a-l folosi din Ruby? … sau, hei, de ce nu merge să compilez modulul ăsta din CPAN, am nevoie de vreun compilator de C? Ştie careva un compilator de C?

Aparent este nevoie de 10 ani pentru a deveni expert în orice domeniu relativ complex. Insă chiar şi în acei 10 ani, este nevoie de multă muncă, şi dacă te loveşti de perspectiva unei schimbări de paradigmă, şi te sperie faptul că trebuie să părăseşti interfaţa “intuitivă” din Windows şi te refugiezi printre click-urile familiare, eh …

Oricum, printre designeri umblă vorba că singura interfaţă intuitivă cu care se nasc oamenii este ţâţa mamei, în restul timpului intuitiv fiind echivalent cu familiar. Şi oricum, nu este ca şi când nu vor trebui să înveţe interfeţe noi de câte ori mai bese Microsoft câte o versiune nouă de Windows.

Dar oricum, îi aşteaptă o surpriză … produsul este proiectat pentru Linux, eu împing din ce în ce mai multe scripturi specifice de Linux, şi fără Cygwin cel puţin o vor beli, dar nu pot spune că nu i-am avertizat ;) Şi abia aştept să-i văd chinuindu-se cu maşini virtuale şi cu erori de Cygwin … mwahahahaha.

Pasul 2 … ???
Pasul 3 … Profit!!!

Posted in evil, technology, unix | No Comments »

Linux tips and tricks (1)

September 16th, 2007 Alex

Istoria liniei de comandă Bash

Bash reţine o istorie a comenzilor date. Şi după câteva luni de utilizare se adună destule artifacte valoroase :) De multe ori aţi vrea să vă reamintiţi vreo comandă pe care aţi dat-o acum câteva săptămâni, aşa cum am fost eu pus în situaţia asta, azi. Aveam nevoie să folosesc funcţia “split” în awk, dar am uitat cum, şi mi-a fost lene să caut pe net. Comanda era ceva de genul:

echo $PATH | awk '{split($0,sep,":"); for (x in sep) print sep[x]}’

Bash reţine toate comenzile date în fisierul .bash_history din directorul personal al utilizatorului. O variantă pentru căutare ar fi deschiderea fişierului cu un editor de texte.

O altă variantă este comanda “history” a cărei rulare este aproximativ echivalentă cu:

cat -n ~/.bash_history

Dacă vrei să deschizi istoria într-un editor de texte, dar nu vrei decât o functionalitate minimală (căutare şi scroll up/down), comanda e ceva de genul:

history | less

Pentru a căuta comanda mea în istoria liniei de comandă, o bună variantă ar fi:

history | grep split

Desigur, în linia de comandă merge să afişezi comenzi din istorie, una câte una, folosind tastele săgeţi UP/DOWN, sau combinaţiile de taste Ctrl-P/Ctrl-N. Se poate deasemenea căuta direct de la promptul liniei de comandă folosind combinaţia de taste Ctrl-R (reverse-interactive-search). Începeţi să tastaţi primele caractere ale comenzi, şi ultima comandă ce corespunde şirului introdus este interactiv afişată.

Raising Elephants Is Utterly Boring

Când calculatorul s-a blocat, deşi se întâmplă mai rar ca-n alte sisteme de operare, se poate totuşi întâmpla, iar combinaţia Ctrl-Alt-Del atât de familiară utilizatorilor de Window nu prea merge.

Restartarea sistemului de operare folosind butonul de RESET al calculatorului nu este sigură deoarece sistemul de fişiere poate fi corupt şi poţi pierde date importante.

Metoda cea mai sigură de restartare este apăsând pe rând tastele R-E-I-U-B în timp ce apăsaţi tastele Alt+SysReq.

Deci încă odată:

Alt + SysReq + R-E-I-U-B

Desigur, fiecare tastă din secvenţa REIUB face ceva diferit, şi poate fi folosită de una singură, dar personal uit mereu ce fac tastele respective (poate dacă mi se bloca calculatorul mai frecvent, le memoram :) ).  Însă un rezumat bun găseşti aici: http://en.wikipedia.org/wiki/Magic_SysRq_key

Omorârea proceselor blocate

Pentru omorârea proceselor blocate din consolă avem nevoie de PID-ul comenzii, găsirea sa făcându-se cu comanda ps. N-o să insist prea mult pe comanda ps, folosirea sa uzuală fiind ceva de genul:

ps ax | grep -i [a]pache

Rezultatul fiind:

 6569 ?        SNs    0:00 /usr/sbin/apache2 -k start
6573 ?        SN     0:00 /usr/sbin/apache2 -k start
6574 ?        SN     0:00 /usr/sbin/apache2 -k start
6575 ?        SN     0:00 /usr/sbin/apache2 -k start
6576 ?        SN     0:00 /usr/sbin/apache2 -k start
6577 ?        SN     0:00 /usr/sbin/apache2 -k start

În exemplul de mai sus procesul cu PID-ul 6569 este procesul principal (master), restul proceselor fiind copii creaţi de procesul principal.
Pentru omorârea unui proces se foloseşte comanda “kill”, ce transmite un semnal de oprire procesului:

kill 6569

Dacă procesul este capabil să răspundă la semnalul “kill”, atunci oprirea va fi facută de proces, nu de sistem. Şi procesele copil vor fi automat oprite, şi fără pierderi de date. Însă există situaţia în care procesul s-a blocat şi vrei să forţezi oprirea sa, comanda fiind astfel:

kill -9 6569

Die mother f*cker

Dacă ai vreun program ce rulează sub Wine (ex. Microsoft Office) şi vrei satisfacţie maximă când îl omori, poţi folosi psDoom, un progrămel bazat pe motorul jocului Doom creat de id Software :)

ss2.gif

Posted in linux, tips&tricks, unix | 2 Comments »

Unixcyclopedia - find

August 30th, 2007 Alex

find este una dintre cele mai utile comenzi valabile din linia de comandă, fiind unul din cele mai bune argumente împotriva folosirii managerelor de fişiere grafice (gen Windows Explorer). Cu un File Explorer grafic nu poţi spune într-un mod eficient “caută-mi toate imaginile ce au fost modificate de utilizatorul alex săptămâna trecută, fă arhivă cu ele, şi trimite-le pe mail lui gigi@gmail.com”. Combinată cu “xargs”, plus alte utilitare ce operează pe fişiere, astfel de operaţii devin de 10 ori mai uşoare şi mai uşor de automatizat.

Descriere pe scurt: caută fişiere ce corespund criteriilor date.

Problema 1: efectuează o căutare recursivă în directorul curent după numele fişierului (cu wildcards)

find . -name "*.jpg"

Rezultatul este ceva de genul …

...
./Fotografii/Vacanțe/La Mare (2007)/dsc00956.jpg
./Fotografii/Vacanțe/La Mare (2007)/dsc00957.jpg
./Fotografii/Vacanțe/La Mare (2007)/dsc00958.jpg
./Fotografii/Vacanțe/La Mare (2007)/dsc00959.jpg
...

Directorul unde se face căutarea este cel curent, denotat cu “.”, dar se poate specifica un alt director.

Problema 2: caută toate fişierele ce aparţin de un anumit utilizator.

find . -user alex

Iar rezultatul este iarăşi ceva de genul …

...
./Audio/ToConvert/Diverse/05-senses-ube.ogg
./Audio/ToConvert/Diverse/06-empathy-ube.ogg
./Audio/ToConvert/Diverse/07-reality-ube.ogg
./Audio/ToConvert/Diverse/08-sanity-ube.ogg
./Audio/ToConvert/Diverse/09-identity-ube.ogg
...

Problema 3: caută fişierele de un anumit tip

Un director este tot un fişier. Deasemenea, sub Linux/Unix, pe lângă fişierele fizice de pe hard-disk mai există şi alte tipuri de fişiere (sub Unix filozofia este … aproape orice resursă poate fi tratată ca un fişier).

Tipurile de fişiere disponibile, aşa cum apar la listing-ul comenzii “ls”, sunt …

- - fişier normal
d - director
l - link
c - fişier special (în general se găsesc în /dev)
s - socket
p - named pipe

Pentru a căuta doar anumite tipuri de fişiere (cum ar fi directoarele) cu find, putem utiliza ceva de genul:

find ~/Media/Fotografii/ -type d

Iar rezultatul …

...
/home/alex/Media/Fotografii/Evenimente/Pasti (2007)
/home/alex/Media/Fotografii/Evenimente/Nuntă Ștefan & Veronica
/home/alex/Media/Fotografii/Evenimente/Moț Ioana
/home/alex/Media/Fotografii/Evenimente/Revelion 2006
...

Problema 4: caută fişierele ce depăşesc o anumită dimensiune:

find ~/Media/Audio -size +10M

Problema 5: combinarea şi negarea condiţiilor … caută toate fişierele din directorul cu fişiere audio ce depăşesc 1 MB şi nu sunt mp3-uri :)

Argumentele pot fi combinate pentru alcătuirea unor criterii de selecţie mai specializate. Deasemenea condiţiile incluse pot fi negate dacă punem în faţa condiţiei semnul exclamării.

find ~/Media/Audio -size +10M ! -name *.mp3

Autopsii :)

Cu find poţi examina ce fişiere au fost modificate în ultimele 3 zile, sau în ultimele 30 de minute de exemplu. Poţi căuta fişiere cu un anumit set de permisiuni. Poţi deasemenea căuta fişiere ce *nu* aparţin de vreun utilizator sau grup.

Cu astfel de căutări poţi face diagnostice în cazul în care ceva nu merge bine (de exemplu în cazul în care sistemul a fost crăcuit, God forbid).
Aşadar şi prin urmare …

Problema 6: cum pot căuta fişierele ce au modificate/accesate în ultimele X zile ?

Opţiunile disponibile sunt următoarele:

-atime: când au fost fişierele ultima oară accesate
-ctime: când au fost permisiunile fişierelor ultima oară schimbate
-mtime: când au fost fişierele ultima oara schimbate

Parametrul [număr întreg] ce apare lângă aceste opţiuni specifică numărul maxim de zile de la ultima schimbare.

Astfel, pentru a afla fişierele ce au fost schimbate în ultimele 24 de ore:

find /etc -user root -mtime 1

Se pot specifica şi minute în loc de zile, folosind următorul set de instrucţiuni:

-amin: în loc de atime
-cmin: în loc de ctime
-mmin: în loc de mtime

Astfel, pentru a afla fişierele ce au fost schimbate în ultimele 30 de minute:

find /etc -user root -mmin 30

Pentru a afla fişierele ce au fost accesate în ultimele 5 minute:

find /etc -user root -amin 5

Problema 7: cum pot afla toate fişierele cu permisiuni complete de accesare?

find ~ -perm 777

Alte opţiuni utile

-nouser: arată fişierele care nu sunt asociate cu un user
-nogroup: arată fişierele care nu sunt asociate cu un grup
-links n: fişierul are N link-uri
-newer file: se găsesc fişierele modificate mai recent decât fişierul “file”

Combinarea comenzii cu xargs

Este foarte util să combini comanda find cu alte comenzi din consolă pentru a putea executa operaţii complexe pe fişiere. E util de exemplu să iei toate imaginile ce aparţin lui Alex şi au fost modificate azi şi să le muţi într-un director de backup.

Comanda find mai suportă şi opţiunea “-exec” pentru rularea unei comenzi pentru fiecare nume de fişier găsit. Însă eu prefer să mă leg de comanda xargs deoarece combinaţia este mai rapida (-exec rulează o instanţă separată a programului declarat pentru fiecare fişier găsit, şi performanţa e mult mai mică pentru un număr mare de fişiere găsite).

Despre xargs: comanda combină parametrul dat cu liniile venite din stdin şi execută comanda astfel creată.
De exemplu “echo "newDirectory" | xargs mkdir” este echivalent cu “mkdir newDirectory“.

Apare însă o problemă: numele de fişiere pot conţine newlines, iar separarea din output a fişierelor din toate exemple de până acum s-a făcut cu newline (fiecare fişier fiind tipărit pe o linie nouă). Pentru a evita astfel de erori la combinarea cu comanda “xargs” se foloseşte parametrul “-print0″ ce pune caractere NULL ca despărţitor în loc de newline … iar la comanda xargs se foloseşte parametrul “-0″ pentru a indica folosirea caracterelor NULL în stdin. Vezi exemplul următor.

Problema 8: cum pot muta toate imaginile JPG (în afară de cele ce au fost făcute “la mare”) într-un director de backup ?

find ~/Media -name *.jpg ! -iwholename *mare* -print0 | xargs -0 mv --target-directory ~/Backup

În încheiere
Desigur, comanda find este chiar complexă şi mai are parametrii posibili de care n-am discutat, deşi i-am acoperit pe cei mai importanţi. Ca de obicei, de câte ori uiţi un parametru sau vrei sa afli mai multe …

man find

Posted in shell, unix, unixcyclopedia | 4 Comments »

Unixcyclopedia - grep

August 20th, 2007 Alex

Prefaţă

Nu sunt singurul care şi-a dat seama de puterea liniei de comandă. Sunt genul de om minimalist, ce-şi bazează munca pe unelte flexibile şi evit cu dârzenie folosirea mediilor de dezvoltare monolitice :) Filozofia UNIX, unde uneltele fac un lucru, dar îl fac bine, întotdeauna m-a atras. Însă din lipsă de timp nu m-am documentat decât “pe diagonală” cu privire la uneltele din lumea UNIX, şi simt că nu-mi folosesc calculatorul la capacitate maximă.

Incep prin urmare o serie de articole mici, destinate utilizării diverselor utilitare din linia de comandă (şi nu numai) … folositoare în primul rând mie, deoarece în acest fel sunt forţat să mă documentez mult mai riguros. Şi cine ştie, poate nu sunt singurul interesat de astfel de reţete.

GREP

Probabil cel mai folosit utilitar din linia de comanda, grep este folosit pentru a căuta apariţii de texte în fişiere. Pentru filtrarea propriu-zisă se dau drept condiţii expresii regulate a căror sintaxă vine în trei versiuni: basic, extended şi perl … adică toate variantele care contează.

Problema nr 1: Cum caut în toate fişierele din directorul curent apariţia cuvântului “wordName” ?

grep -r wordName .

-r — opţiunea parcurge recursiv directorul indicat (în cazul nostru directorul curent, indicat prin “.” [punct]). Instrucţiunea este echivalentă cu …

find . -print | xargs grep wordName

Problema nr 2: Cum fac o căutare case-insensitive în toate fişierele cu extensia “*.rb” din directorul /home/alex/sampleDir ?

grep -i -r --include=*.rb wordName /home/alex/sampleDir

Opţiunea -i este pentru căutare case-insensitive. Iar opţiunea –include face căutarea doar în fişiere ce se potrivesc şablonului indicat.

Instrucţiunea este echivalentă cu …

find /home/alex/sampleDir -name *.rb -print | xargs grep wordName

Problema nr 3: cum fac să-mi afişeze contextul rezultatelor găsite la căutare ?

grep -C 1 alex /etc/passwd

Cu opţiunea -C [n] se afişează n linii de deasupra şi n linii de dedesuptul liniei ce corespunde căutării.

Problema nr 4: cum fac să-mi afişeze doar calea către fişierele ce sunt găsite la căutare ?

grep -l 'class' *.php

Comanda de mai sus poate fi combinată pentru efecte super-marfă. De exemplu putem copia toate fisierele *.php ce conţin cuvântul “class” într-un director la alegere …

grep -l 'class' *.php | xargs mv -t /target/directory

Problema nr 5: cum pot afla PID-ul proceselor Apache ?

Oops, o problemă practică şi extrem de uzuală ?

Pentru o afişare brută, este suficient ceva de genul …

ps aux | grep [a]pache

“ps” afişează lista de procese active, dar ce-i cu expresia “[a]pache” ? Simplu … dacă puneam cuvântul “apache” s-ar fi afişat în listă şi procesul comenzii enunţate.

Pentru omorârea tuturor proceselor “apache” (presupunând că s-au blocat şi nu e posibilă oprirea normală … situaţie destul de anormală) e suficientă o comandă de genul …

ps aux | grep [a]pache | awk ‘{print $1}’ | xargs kill -9

Eh … “awk” este un zeu al procesării de texte, dar vorbim altădată despre asta :)

Problema nr 6: cum pot elimina liniile nedorite (cum ar fi liniile goale) dintr-un fişier ?

cat file.txt | grep -v ^[[:space:]]*$

Opţiunea -v afişează toate liniile care nu corespund expresiei date.

Problema nr 7: cum pot afişa numele tuturor fisierelor care nu conţin un anumit cuvânt ?

Să zicem că vrem să aflăm toate fişierele *.php din directorul curent care nu conţin cuvântul “function”.

grep -L 'function' *.php

Opţiunea -L afişează toate fişierele unde nu este găsită nici o linie ce corespunde expresiei.

Concluzie

grep este o comandă pe cât de simplă, pe atât de puternică. Aş vrea să dau un ultim exemplu ce demonstrează capabilitaţile de combinare a comenzilor prin pipe-urile liniei de comandă:

ps aux | grep [a]pache | grep root | awk ‘{print “/proc/” $2 “/status”}’ | xargs cat | grep -i vm

Comanda (testată pe Debian/Ubuntu) afişează ceva e genul …

VmPeak: 23252 kB
VmSize: 23252 kB
VmLck: 0 kB
VmHWM: 6716 kB
VmRSS: 6716 kB
VmData: 3068 kB
VmStk: 88 kB
VmExe: 328 kB
VmLib: 18528 kB
VmPTE: 32 kB

Pretty cool, huh ?

Cu puţină imaginaţie e posibilă crearea unor instrumente de monitorizare a proceselor destul de avansate ;)

Posted in shell, unix, unixcyclopedia | 3 Comments »