Source: http://www.cs.usfca.edu/~parrt/course/601/lectures/unix.util.html
Terence Parr
Zadnja promjena: Avgust 30, 2006
UNIX je izuzetno popularna platforma za razvijanje server softver dijelom zbog njegove sigurnosti i stabilnosti, ali i zato što ima bogatu skup komandne linije i skriptiranje alata. Programeri koriste ove alate za manipulaciju sistema datoteka, obrade datoteka dnevnika, i generalno automatizaciju što je više moguće.
Ako želite da bude ozbiljan server developer, morat ćete imati određeni objekat sa brojem UNIX alata; oko 15. Vidjet ćete početi vidjeti sličnosti među njima, posebno regularnih izraza, i uskoro ćete se osjećati vrlo ugodno. Kombinirajući jednostavnih komandi, možete izgraditi vrlo moćan alat vrlo brzo – mnogo brže nego što bi mogao izgraditi ekvivalent funkcionalnost u C ili Java, na primjer.
Ovo predavanje vas vodi kroz osnovne komande i onda pokazuje kako da ih kombinirati u jednostavne obrasce ili idioma pružiti sofisticirane funkcije poput histogramming. Ovo predavanje pretpostavlja da znate šta je granata je i da imate neke osnovne poznavanje UNIX.
[Usput, ove stranice dobiva veliku pažnju na internetu i na žalost ja dobiti mail od puno ljudi koji imaju bolja rješenja ili stvari koje sam trebao dodati. Ja samo pokazuje ono što sam naučio gledajući dobar UNIX ljudi tako da ne kažem ove savjete su optimalna rješenja. Ja bi bio prilično neuk sys admin.]
Sve je potok
Prva stvar koju trebate znati je da UNIX se temelji na ideji potoka. Sve je potok, ili se čini da. Upravljački programi izgledaju kao potoci, terminali izgledaju kao potoci, procesi komuniciraju preko potoka, itd … ulaz i izlaz programa su potoci koji možete preusmjeriti u uređaj, datoteku, ili neki drugi program.
Ovdje je primjer uređaja, null uređaj, koji vam omogućuje da baciti izlaz daleko. Na primjer, možda želite pokrenuti program, ali zanemariti izlaz.
$ ls > /dev/null # ignore output of ls
gdje “# ignore output of ls” je komentar.
Većina komandi obuhvaćeni u ovom procesu predavanja stdin i poslati rezultate na stdout. Na ovaj način, možete postepeno obrađivati tok podataka hooking izlaz jedan alat za ulaz drugog preko cijevi. Na primjer, sljedeće piped sekvence ispisuje broj datoteka u trenutnom direktoriju modifikovani u avgustu.
$ ls -l | grep Aug | wc -l
Zamislite koliko bi vremena bilo potrebno da napišete ekvivalent C ili Java program. Možete postati vrlo produktivan UNIX programer ako naučite kombinirati jednostavne komandne linije alat. Čak i kada programiranje na PC-u, koristim MKS-a UNIX ljuske i komande biblioteku da izgleda kao UNIX kutiju. Vrijedan novac.
Dobivanje pomoći
Ako vam je potrebno da znate o komandu, pitajte za “čovjeka” stranici. Na primjer, da biste saznali o ls komande, tipa
$ man ls
LS(1) System General Commands Manual LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [-ACFLRSTWacdfgiklnoqrstux1] [file ...]
DESCRIPTION
For each operand that names a file of a type other than directory, ls
...
Vi ćete dobiti sažetak komande i bilo argumenata.
Ako se ne možete sjetiti imena komande, pokušajte koristiti odnosno koji pronalazi komande i knjižnica rutina koje se odnose na tu riječ. Na primjer, da biste saznali kako to učiniti sume, tipa
$ apropos checksum
cksum(1), sum(1) - display file checksums and block counts
md5(1) - calculate a message-digest fingerprint (checksum) for a file
Posebna direktorija i datoteka
Vidi @http: //www.thegeekstuff.com/2010/09/linux-file-system-structure
Prečica za te kući direktorij, / home / korisničko ime, je ~ ime. Na primjer, ~ parrt je moj dom direktorij, / home / parrt.
Kada koristite Shell, postoji pojam trenutni direktorij. Dot ‘.’ lik je skraćenica za trenutni direktorij i “..” je skraćenica za direktorij iznad trenutne. Dakle, za pristup testu datoteku u trenutnom direktoriju, ./test je isti kao i običan test. Ako test je direktorij iznad, koristite ../test.
/ Je korijenski direktorij; nema drive specifikacija u UNIX.
U .bash_profile datoteka je vrlo važan jer je to kako je vaš shell sjednici inicijalizovana uključujući sve važne varijable CLASSPATH. Vaš bash shell pokretanja datoteke je ~ korisničko ime / .bash_profile i postaviti kod ovako:
PATH=$PATH:$HOME/bin
Obično ćete ići u i postavite CLASSPATH, tako da ne morate postaviti to stalno.
export CLASSPATH=".:/home/public/cs601/junit.jar"
Izvoz znači da je zadatak da CLASSPATH je vidljiv svim dijete procesa (koji je, vidljiv svim programima pokrenete iz ljuske).
Osnove
cd
Mijenjanje direktorij se radi sa cd dir gdje dir može biti “.” ili “..” da se preseli u trenutni direktorij (ništa) ili da se direktorij.
ls
Prikaz datoteka u direktoriju sa ls. -l Opcija se koristi za prikaz detalja datoteka:
total 9592
-rw-r--r-- 1 parrt staff 5600 Aug 19 2005 C-Java-relationship.html
...
drwxr-xr-x 13 parrt staff 442 Oct 19 2005 sessions
-rw-r--r-- 1 parrt staff 2488 Oct 19 2005 sessions.html
...
“staff” je grupa parrt.
Ako želite da vidite skrivene datoteke (oni koji počinju sa “.”), Koristi “-a”.
Kombinacije su moguće: koristiti “ls -la” da vidi detalje svih datoteka, uključujući skrivene one.
Prikazivanje datoteka
Postoje 4 korisnih načina za prikaz sadržaja ili dijelova datoteke. Prvi je vrlo često koristi komandu cat. Na primjer, za prikaz mojoj listi objektno orijentisanog ključne riječi koriste u ovom Naravno, tip:
$ cat /home/public/cs601/oo.keywords.txt
Ako je datoteka je zaista veliki, vjerojatno ćete želite koristiti više, koji pljuje fajl u komade ekran veličine.
$ more /var/log/mail.log
Ako samo želite vidjeti prvih nekoliko linija datoteke ili posljednjih nekoliko redova koristiti glavu i rep.
$ head /var/log/mail.log
$ tail /var/log/mail.log
Možete odrediti broj kao argument da se određeni broj linija:
$ head -30 /var/log/mail.log
Najkorisniji bajalicu repa štampa posljednjih nekoliko linija datoteke i zatim čeka, štampanje novih linija jer su u prilogu datoteke. To je odlično za gledanje datoteke dnevnika:
$ tail -f /var/log/mail.log
Ako je potrebno da znate koliko slova, riječi, ili linije u datoteku, koristiti wc:
$ wc /var/log/mail.log
164 2916 37896 /var/log/mail.log
Gdje su brojevi, kako bi, linija, riječi, onda znakova. Radi jasnoće, možete koristiti wc -l za ispis samo broj linija.
pushd, popd
Umjesto CD možete koristiti pushd da biste sačuvali trenutne dir i onda automatski cd na određeni direktorij. Na primjer,
$ pwd
/Users/parrt
$ pushd /tmp
/tmp ~
$ pwd
/tmp
$ popd
~
$ pwd
/Users/parrt
top
Za gledanje dinamički prikaz procesa na kutiji u akciji, koristite top.
ps
Da biste ispisati (široki zaslon) sve procese koji rade na kutiji, korištenje ps auxwww.
chmod
Za promjenu privilegija fajl ili folder, upotreba chmod. Privilegije su 3 cifra oktalni riječi sa 3 bita po cifra: rwxrwxrwx gdje prva znamenka je za vlasnika datoteke, 2. za grupu, i 3. za bilo koga. 644 je uobičajena riječ vrijednost datoteka, što znači 110.100.100 ili RW-r – r–. Kada radite ls -l ćete vidjeti ove bita. 755 je uobičajena riječ vrijednost za direktorija: rwxr-xr-x gdje direktoriji moraju biti izvršne za CD da bi mogao da uđe da dir. 755 je skraćenica za više čitljiv argument u = rwx, idite = rx. U je korisnik, G je grupa, o je drugi.
Koristite chmod -R za rekurzivno se primjenjuju na sve DIROVI ispod argument kao dobro.
Pretraživanje potocima
Jedan od najkorisnijih alata na raspolaganju na UNIX i onaj koji vam može koristiti najviše je grep. Ovaj alat utakmice regularne izraze (koji uključuje jednostavne riječi) i otisci odgovaraju linijama na zaslon računala.
Najjednostavniji bajalicu traži određenu sekvencu znakova u skupu datoteka. Ovdje je primjer koji izgleda za bilo kakvo pozivanje na sustav u Java datoteka u trenutnom direktoriju.
grep System *.java
Možete naći dot ‘.’ regularni izraz koristan. To odgovara bilo koji jedan znak, ali je obično u kombinaciji sa zvijezda, koja odgovara nula ili više od stavke prethodnog. Budite oprezni da priloži izraz u jednostrukim navodnicima tako proširenje komandne linije ne mijenjati argument. Sljedeći primjer, traži reference na bilo koji forum stranice u datoteci server log:
$ grep '/forum/.*' /home/public/cs601/unix/access.log
ili ekvivalentno:
$ cat /home/public/cs601/unix/access.log | grep '/forum/.*'
Drugi oblik je korisno kada želite da obrađuje zbirku datoteka kao jedan tok kao u:
cat /home/public/cs601/unix/access*.log | grep '/forum/.*'
Ako trebate pogledati za niz na početku linije, koristite znak za umetanje ‘^’:
$ grep '^195.77.105.200' /home/public/cs601/unix/access*.log
Ovo pronalazi sve linije u sve pristupne trupaca koje počinju s IP adresa 195.77.105.200.
Ako želite da preokrene obrazac odgovara da linije koje ne odgovaraju obrazac, koristite -v. Ovdje je primjer koji pronalazi reference na ne slika se u datoteku dnevnika:
$ cat /home/public/cs601/unix/access.log | grep -v '/images'
Sada zamislite da imate datoteku http dnevnika i želite da filtrira zahtjeva stranice od strane neljudskih pauka. Ako imate datoteku pod nazivom spider.IPs, možete pronaći sve nonspider pogleda stranicu putem:
$ cat /home/public/cs601/unix/access.log | grep -v -f /tmp/spider.IPs
Na kraju, da ne obraća pažnju slučaju ulaznog toka, koriste -i.
Prijevodi potocima
Pretvara tekst potok je jedan od osnovnih operacija UNIX. PERL je dobar alat za to, ali pošto mi se ne sviđa PERL ja ostajem sa tri alata: tr, sed, i awk. PERL i ovi alati su line-by-line alata u da su oni dobro rade samo na obrasce u potpunosti sadržana u jednoj liniji. Ako je potrebno da obrađuju složenije obrasce kao XML ili trebate analizirati programski jezik, koristite kontekst bez gramatike alat kao što je ANTLR.
tr
Za manipulaciju razmaka, naći ćete tr vrlo koristan.
Ako imate kolone podataka odvojenih prostora i želite kolone do kolapsa tako da postoji jedan stupac podataka, reci tr zamijeniti prostor za novi red tr ” ‘\ n’. Uzmite u obzir ulaznu datoteku / home / javne / cs601 / Unix / imena:
jim scott mike
bill randy tom
Da bi sve te imena u koloni, upotreba
$ cat /home/public/cs601/unix/names | tr ' ' '\n'
Ako želite srušiti sve sekvence prostora u jedan prostor, koristiti tr -s ”.
Za pretvaranje PC datoteke u UNIX, morate se riješiti ‘\ r’ znakova. Koristite tr -d ‘\ r’.
sed
Ako je ispuštanje ili prevođenje jednim znakova nije dovoljno, možete koristiti sed (urednik potok) zamijeniti ili brisanje teksta komade neprecizan regularnih izraza. Na primjer, za brisanje svih referenci na riječ Scott u datoteku imena iz gore, upotreba
$ cat /home/public/cs601/unix/names | sed 's/scott//'
koji zamjenjuje Scott za ništa. Ako postoji više referenci na Scott na jednoj liniji, koristite G sufiks da ukaže “globalno” na toj liniji inače samo prvo pojavljivanje će biti uklonjena:
$ ... | sed 's/scott//g'
Ako želite zamijeniti reference na view.jsp sa index.jsp, upotreba
$ ... | sed 's/view.jsp/index.jsp/'
Ako želite bilo kakve .asp datoteke pretvara u .jsp, morate odgovarati ime datoteke s regularni izraz i odnose se na to preko \ 1:
$ ... | sed 's/\(.*\).asp/\1.jsp/'
The \ (… \) grupiranje prikuplja tekst koji se može odnositi na s \ 1.
Ako želite da ubiju sve, od ‘,’ karakter do kraja linije, koristite end-of-line marker $:
$ ... | sed 's/,.*$//' # kill from comma to end of line
awk
Kada vam je potrebna za rad s kolone podataka ili izvrši malo koda za svaku liniju podudaranje uzorak, koristiti awk. awk programi su obrazac akcije parova. Dok su neki awk programi su dovoljno komplikovano zahtijeva poseban fajl koji sadrži program, možete učiniti neke sjajne stvari pomoću argument u komandnoj liniji.
awk misli ulazne linije su razbijena u polja (i.e., kolone) odvojeni razmakom. Polja su navedeni u akciju preko $ 1 $ 2, … a $ 0 odnosi na cijelu unos.
A obrazac-akcija par izgleda ovako:
pattern {action}
Ako izostavite obrazac, akcija se izvršava za svaki unos. Izostavljajući akciju znači ispis linije. Možete odvojiti parova od strane nove linije ili zarez.
Razmislite ulaz
aasghar Asghar, Ali
wchen Chen, Wei
zchen Chen, Zhen-Jian
Ako želite spisak imena prijava, pitajte awk za ispis prve kolone:
$ cat /home/public/cs601/unix/emails.txt | awk '{print $1;}'
Ako želite pretvoriti imena prijava na e-mail adrese, koristite funkciju printf C-Lookalike:
$ cat /home/public/cs601/unix/emails.txt | awk '{printf("%[email protected],",$1);}'
Zbog nestalih \ n u printf string, vidjet ćete izlaz sve na jednoj liniji spreman za lijepljenje u program mail:
[email protected],[email protected],[email protected]
Možda ćete također žele preurediti kolone podataka. Za ispis firstname, prezime, možda probati:
$ cat /home/public/cs601/unix/emails.txt | awk '{printf("%s %s\n", $3, $2);}'
ali ćete primijetiti da je i dalje tu zarez jer je dio kolone:
Ali Asghar,
Wei Chen,
Zhen-Jian Chen,
Potrebno je da cijevi izlaz kroz TR (ili sed) da se skinu zarez:
$ cat /home/public/cs601/unix/emails.txt | \
awk '{printf("%s %s\n", $3, $2);}' | \
tr -d ','
Tada ćete vidjeti:
Ali Asghar
Wei Chen
Zhen-Jian Chen
Također možete koristiti awk ispitati vrijednosti sadržaja. Da sumiramo prvu kolonu sljedeće podatke (u datoteci / home / javne / cs601 / Unix / kava):
3 parrt
2 jcoker
8 tombu
koristiti sljedeće jednostavne komande:
$ awk '{n+=$1;} ; END {print n;}' < /home/public/cs601/unix/coffee
gdje END je poseban obrazac koji znači “nakon obrade potoka.”
Ako želite filtrirati ili sabrati sve vrijednosti manje od ili jednako, recimo 3, koristiti ako izjavu:
$ awk '{if ($1<=3) n+=$1;} END {print n;}' < /home/public/cs601/unix/coffee
U ovom slučaju, vidjet ćete izlaz 5 (3 + 2);
Korištenje awk zgrabiti određeni kolona je vrlo česta pri obradi datoteka dnevnika. Razmotrimo http://www.jguru.com stranicu pogled datoteku dnevnika, /home/public/cs601/unix/pageview-20021022.log, da su u obliku:
date-stamp(thread-name): userID-or-IPaddr URL site-section
Dakle, podaci izgleda ovako:
20021022_00.00.04(tcpConnection-80-3019): 203.6.152.30 /faq/subtopic.jsp?topicID=472&page=2 FAQs
20021022_00.00.07(tcpConnection-80-2981): 995134 /index.jsp Home
20021022_00.00.08(tcpConnection-80-2901): 66.67.34.44 /faq/subtopic.jsp?topicID=364 FAQs
20021022_00.00.12(tcpConnection-80-3003): 217.65.96.13 /faq/view.jsp?EID=736437 FAQs
20021022_00.00.13(tcpConnection-80-3019): 203.124.210.98 /faq/topicindex.jsp?topic=JSP FAQs/JSP
20021022_00.00.15(tcpConnection-80-2988): 202.56.231.154 /faq/index.jsp FAQs
20021022_00.00.19(tcpConnection-80-2976): 66.67.34.44 /faq/view.jsp?EID=225150 FAQs
220021022_00.00.21(tcpConnection-80-2974): 143.89.192.5 /forums/most_active.jsp?topic=EJB Forums/EJB
20021022_00.00.21(tcpConnection-80-2996): 193.108.239.34 /guru/edit_account.jsp Guru
20021022_00.00.21(tcpConnection-80-2996): 193.108.239.34 /misc/login.jsp Misc
...
Kada se korisnik prijavljeni, datoteci dnevnika ima svoj korisnički ID, a ne njihove IP adrese.
Evo kako možete dobiti popis URL-ova koje ljudi gledaju na recimo 22. oktobar 2002:
$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log
/faq/subtopic.jsp?topicID=472&page=2
/index.jsp
/faq/subtopic.jsp?topicID=364
/faq/view.jsp?EID=736437
/faq/topicindex.jsp?topic=JSP
/faq/index.jsp
/faq/view.jsp?EID=225150
/forums/most_active.jsp?topic=EJB
/guru/edit_account.jsp
/misc/login.jsp
...
Ako želite računati koliko pregleda stranica bilo koji dan da se ne obrađuje stranice (moje stranice obrade su sve forme process_xxx), cijevi rezultate kroz grep i wc zajedno:
$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log | \
grep -v process | \
wc -l
67850
Ako želite jedinstveni popis URL-ova, možete sortirati izlaz, a zatim koristiti uniq:
$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log | \
sort | \
uniq
uniq samo ruši sve ponavlja linije u jednoj liniji – to je razlog zašto morate prvo sortirati izlaz. Vi ćete dobiti izlaz kao što su:
/article/index.jsp
/article/index.jsp?page=1
/article/index.jsp?page=10
/article/index.jsp?page=2
...
Tarballs
Napomena: Naziv dolazi iz sličnih riječi, dlaka (stvari koje mačke povratiti), prilično sam siguran.
Prikupiti gomilu datoteke i direktorije zajedno, koristite katran. Na primjer, da katranom se čitav svoj home direktorij i stavite arhive u / tmp, učiniti
$ cd ~parrt
$ cd .. # go one dir above dir you want to tar
$ tar cvf /tmp/parrt.backup.tar parrt
Po konvenciji, koristite .tar kao produžetak. Da untar ovo korištenje datoteka
$ cd /tmp
$ tar xvf parrt.backup.tar
katran untars stvari u trenutnom direktoriju!
Nakon pokretanja untar, naći ćete novi direktorij, / tmp / parrt, da je kopija vašeg home direktorij. Imajte na umu da način na koji katranom stvari diktira strukturu direktorija kad untarred. Činjenica da sam u stvaranju tar spomenuo parrt znači da ću morati da dir kad untarred. Nasuprot tome, u narednom će napraviti kopiju moj dom direktorija, ali bez jednog parrt root dir:
$ cd ~parrt
$ tar cvf /tmp/parrt.backup.tar *
To je dobra ideja da se katranom stvari sa root direktorij, tako da kad untar ne stvaraju milion datoteke u trenutnoj direktno. Da vidimo šta je u arhive, upotreba
$ tar tvf /tmp/parrt.backup.tar
Većinu vremena možete uštedjeti prostor pomoću z argument. Tarball će tada biti gzip’d i ne bi trebalo koristiti nastavak datoteke .tar.gz:
$ cd ~parrt
$ cd .. # go one dir above dir you want to tar
$ tar cvfz /tmp/parrt.backup.tar.gz parrt
Otpakivanje zahtijeva z argument i:
$ cd /tmp
$ tar xvfz parrt.backup.tar.gz
Ako imate veliku datoteku komprimirati, koristite gzip:
$ gzip bigfile
Nakon pogubljenja, vaša datoteka će je preimenovan bigfile.gz. Da biste raspakirali, koristite
$ gzip -d bigfile.gz
Da biste prikazali tekstualnu datoteku koja se trenutno gzip’d, koristite zcat:
$ zcat bigfile.gz
Kreće datoteke između mašine
rsync
Kada je potrebno imati direktorij na jednoj mašini odraz na drugoj mašini, koristite rsync. On uspoređuje sve datoteke u direktoriju pod drvo i kopije u odnosu na bilo koji su se promijenile u ogledalima direktorij na drugi stroj. Na primjer, evo kako bi mogao “povući” sve za rezanje datoteke iz livebox.jguru.com u kutiju iz koje ste izvršiti rsync naredbe:
$ hostname
jazz.jguru.com
$ rsync -rabz -e ssh -v '[email protected]:/var/log/jguru/*' \
/backup/web/logs
rsync će izbrisati ili skratiti datoteke kako bi se osiguralo datoteke ostaju isti. Ovo je loše ako obrišete datoteku greškom – to će zbrisati svoj backup datoteka. Dodaj argument zove –suffix reći rsync napraviti kopiju bilo koje postojeće datoteke prije nego što ga prepisuje:
$ hostname
jazz.jguru.com
$ rsync -rabz -e ssh -v --suffix .rsync_`date '+%Y%m%d'` \
'[email protected]:/var/log/jguru/*' /backup/web/logs
gdje `datum ‘+% Y% m% d’` (u obrnutom jednostruke navodnike) znači “izvršiti ovaj datum komandu”.
Da biste izuzeli određene obrasce iz sync, koristite –exclude:
$ rsync -rabz --exclude=entitymanager/ --suffix .rsync_`date '+%Y%m%d'` \
-e ssh -v '[email protected]:/var/log/jguru/*' /backup/web/logs
scp
Da biste ručno kopirali datoteku ili direktorij, koristite scp:
$ scp lecture.html [email protected]:~parrt/lectures
Baš kao k.č., koristiti -r da rekurzivno kopiranje direktorija.
Razni
find
Većina GUI za Linux ili PC imaju pretraživanje objekt, ali iz komandne linije možete koristiti naći. Da biste pronašli sve datoteke pod nazivom .p4 početkom u direktoriju ~ / ANTLR / Depot / projekata, upotreba:
$ find ~/antlr/depot/projects -name '.p4'
Na default “akcija” je -print.
Možete navesti regularni izraz koji odgovaraju. Na primjer, pogledati ispod home direktorij za bilo koji XML datoteke, koristite:
$ find ~ -name '*.xml' -print
Napomena korištenje jednostruke navodnike za sprečavanje širenja komandne linije – želite da se ‘*’ da idem na find komandu.
Možete izvršiti naredbu za svaku datoteku ili direktorij je utvrdio da odgovara ime. Na primjer, da li izbrisati sve XML datoteke, uradite ovo:
$ find ~ -name '*.xml' -exec rm {} \;
gdje “{}” je skraćenica za “trenutnu datoteku koja odgovara”. Kraj komande moraju biti raskinut s ‘;’ ali zbog širenja komandne linije, morat ćete izbjeći ‘;’.
Možete navesti i informacije o vremenu u vašem upitu. Ovdje je shell skriptu koja koristi pronaći izbrisati sve datoteke starije od 14 dana.
#!/bin/sh
BACKUP_DIR=/var/data/backup
# number of days to keep backups
AGE=14 # days
AGE_MINS=$[ $AGE * 60 * 24 ]
# delete dirs/files
find $BACKUP_DIR/* -cmin +$AGE_MINS -type d -exec rm -rf {} \;
Koristite find u leđa krpelja kao argument:
vi `find . -name '*.java'` # open all java files below current dir
fuser
Ako želite da znate ko koristi port, kao što su HTTP (80), koristite grejača. Morate biti root za ovaj koristiti:
$ sudo /sbin/fuser -n tcp 80
80/tcp: 13476 13477 13478 13479 13480
13481 13482 13483 13484 13486 13487 13489 13490 13491
13492 13493 13495 13496 13497 13498 13499 13500 13501 13608
Izlaz ukazuje na listi procesa u vezi sa tim portom.
whereis
Ponekad želite da koristite komandu, ali to nije u vašem putu i ne možete sjetiti gdje je. Koristite whereis gledati u standardnim UNIX lokacije za naredbu.
$ whereis fuser
fuser: /sbin/fuser /usr/man/man1/fuser.1 /usr/man/man1/fuser.1.gz
$ whereis ls
ls: /bin/ls /usr/man/man1/ls.1 /usr/man/man1/ls.1.gz
whereis pokazuje man stranice.
which
Ponekad vam se može izvršenje pogrešnu verziju komande i želite znati koju verziju komande PATH ukazuje treba pokrenuti. Koristite što da pitam:
$ which ls
alias ls='ls --color=tty'
/bin/ls
$ which java
/usr/local/java/bin/java
Ako se ništa ne nalazi u vašem putu, vidjet ćete:
$ which fuser
/usr/bin/which: no fuser in (/usr/local/bin:/usr/local/java/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/X11R6/bin:/home/parrt/bin)
kill
Da biste poslali signal na proces, koristite kill. Obično ćete želite da se samo reći kill PID gdje PID mogu se naći od PS ili vrha (vidi dolje).
Koristite kill -9 PID kada ne možete dobiti proces da umre; to znači ubiti ga sa “ekstremnim predrasudama”.
traceroute
Ako imate problema da na licu mjesta, koristite traceroute gledati slijed hmelja koriste da bi na licu mjesta:
$ /usr/sbin/traceroute www.cnn.com
1 65.219.20.145 (65.219.20.145) 2.348 ms 1.87 ms 1.814 ms
2 loopback0.gw5.sfo4.alter.net (137.39.11.23) 3.667 ms 3.741 ms 3.695 ms
3 160.atm3-0.xr1.sfo4.alter.net (152.63.51.190) 3.855 ms 3.825 ms 3.993 ms
...
Koja je moja IP adresa?
$ /sbin/ifconfig
Pod eth0 sučelje, vidjet ćete inet addr:
eth0 Link encap:Ethernet HWaddr 00:10:DC:58:B1:F0
inet addr:138.202.170.4 Bcast:138.202.170.255 Mask:255.255.255.0
Korisni kombinacije
Kako ubiti skup procesa
Ako želite da ubije sve Java procesa radi za parrt, možete ili pokrenuti killall java ako ste parrt ili generirati “ubiti” skriptu putem:
$ ps auxwww|grep java|grep parrt|awk '{print "kill -9 ",$2;}' > /tmp/killparrt
$ bash /tmp/killparrt # run resulting script
/ Tmp / killparrt datoteka će izgledati ovako:
kill -9 1021
kill -9 1023
kill -9 1024
Napomena: također možete učiniti zajednički zadatak sa:
$ killall java
Imajte na umu da je ovo linux specifičan; Rečeno mi je da će ubiti sve prerade na UNIXen kao Solaris!
Kako napraviti histogramu
Histograma je skup brojanja, vrijednost parova ukazuje koliko se često javlja vrijednost. Osnovna operacija će biti za sortiranje, onda računati koliko vrednosti se javljaju u nizu i zatim preokrenuti vrsta, tako da je vrijednost sa najvišim broj je na vrhu izvještaja.
$ ... | sort |uniq -c|sort -r -n
Imajte na umu da vrsta vrsta u cjelini liniji, ali je prva kolona je očito značajan baš kao što je prvo slovo u nečije prezime znatno pozicionira svoje ime u sortirane liste.
uniq -C ruši sve ponovljene sekvence vrijednosti, ali ispisuje broj pojavljivanja pred vrijednosti. Podsjetimo prethodnog sortiranja:
$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log | \
sort | \
uniq
/article/index.jsp
/article/index.jsp?page=1
/article/index.jsp?page=10
/article/index.jsp?page=2
...
Sada dodajte -C na uniq:
$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log | \
sort | \
uniq -c
623 /article/index.jsp
6 /article/index.jsp?page=1
10 /article/index.jsp?page=10
109 /article/index.jsp?page=2
...
Sada sve što morate učiniti je obrnuto vrsta linije prema prvim kolonu brojčano.
$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log | \
sort | \
uniq -c | \
sort -r -n
6170 /index.jsp
2916 /search/results.jsp
1397 /faq/index.jsp
1018 /forums/index.jsp
884 /faq/home.jsp?topic=Tomcat
...
U praksi, možda želite dobiti histogram koji je “despidered” i samo ima pogled u vezi FAQ. Možete filtrirati sve stranice pogled linije povezane s pauk IP adresa i filtera u samo FAQ linije:
$ grep -v -f /tmp/spider.IPs /home/public/cs601/unix/pageview-20021022.log | \
awk '{print $3;}'| \
grep '/faq' | \
sort | \
uniq -c | \
sort -r -n
1397 /faq/index.jsp
884 /faq/home.jsp?topic=Tomcat
525 /faq/home.jsp?topic=Struts
501 /faq/home.jsp?topic=JSP
423 /faq/home.jsp?topic=EJB
...
Ako želite da vidite samo despidered FAQ stranice koje su navedeni više od 500 puta, dodajte awk komandu do kraja.
$ grep -v -f /tmp/spider.IPs /home/public/cs601/unix/pageview-20021022.log | \
awk '{print $3;}'| \
grep '/faq' | \
sort | \
uniq -c | \
sort -r -n | \
awk '{if ($1>500) print $0;}'
1397 /faq/index.jsp
884 /faq/home.jsp?topic=Tomcat
525 /faq/home.jsp?topic=Struts
501 /faq/home.jsp?topic=JSP
Generiranje Java klase hijerarhije dijagrama
Student je pitao da li sam znao programa koji generira klasa hijerarhije dijagrama. Ja sam rekao “ne”, ali onda sam shvatio da ne treba. Evo jedan brod da to uradi:
# pulls out superclass and class as $5 and $3:
# public class A extends B ...
# only works for public classes and usual formatting
cat *.java | grep 'public class' $1 | \
awk 'BEGIN {print "digraph foo {";} {print $5 "->" $3;} END {print "}"}'
To stvara grafikon datoteke DOT formatu. Probaj. To je sjajno. Radovi za većinu slučajeva. Izlaz izgleda ovako:
digraph foo {
antlr.CharScanner->JavaLexer
antlr.LLkParser->Mantra
->TestLexer
}
Generiranje skripte i programe
Volim da automatizirati što je više moguće. Ponekad to znači pisanje programa koji generira drugi program ili skripte.
Obrada mail datoteke
Htio sam da se niz SQL naredbi koje će ažurirati našu bazu podataka kad god neko email odbila. Obrada datoteke pošte je prilično jednostavan, jer možete pogledati kod greške zatim e-mail adresu. A odbila email izgleda ovako:
From [email protected] Wed Jan 9 17:32:33 2002
Return-Path: <>
Received: from web.jguru.com (web.jguru.com [64.49.216.133])
by localhost.localdomain (8.9.3/8.9.3) with ESMTP id RAA18767
for <[email protected]>; Wed, 9 Jan 2002 17:32:32 -0800
Received: from localhost (localhost)
by web.jguru.com (8.11.6/8.11.6) id g0A1W2o02285;
Wed, 9 Jan 2002 17:32:02 -0800
Date: Wed, 9 Jan 2002 17:32:02 -0800
From: Mail Delivery Subsystem <[email protected]>
Message-Id: <[email protected]>
To: <[email protected]>
MIME-Version: 1.0
Content-Type: multipart/report; report-type=delivery-status;
boundary="g0A1W2o02285.1010626322/web.jguru.com"
Subject: Returned mail: see transcript for details
Auto-Submitted: auto-generated (failure)
This is a MIME-encapsulated message
--g0A1W2o02285.1010626322/web.jguru.com
The original message was received at Wed, 9 Jan 2002 17:32:02 -0800
from localhost [127.0.0.1]
----- The following addresses had permanent fatal errors -----
<[email protected]>
(reason: 550 Host unknown)
----- Transcript of session follows -----
550 5.1.2 <[email protected]>... Host unknown (Name server: intheneck.com: host not found)
...
Obratite pažnju poruka o grešci SMTP 550. Pogledajte za koje na početku linije onda ubiti zagradi ugao, izvadite … i koristiti awk za štampanje SQL:
# This script works on one email or a file full of other emails
# since it just looks for the SMTP 550 or 554 results and then
# converts them to SQL commands.
grep -E '^(550|554)' | \
sed 's/[<>]//g' | \
sed 's/\.\.\.//' | \
awk "{printf(\"UPDATE PERSON SET bounce=1 WHERE email='%s';\n\",\$3);}" >> bounces.sql
Moram pobjeći 3 $ jer to znači da nešto surround bash skriptu i želim awk da vidim znak za dolar.
Generiranje getter/setters
#!/bin/bash
# From a type and name (plus firstlettercap version),
# generate a Java getter and setter
#
# Example: getter.setter String name Name
#
TYPE=$1
NAME=$2
UPPER_NAME=$3
echo "public $TYPE get$UPPER_NAME() {"
echo " return $NAME;"
echo "}"
echo
echo "void set$UPPER_NAME($TYPE $NAME) {"
echo " this.$NAME = $NAME;"
echo "}"
echo
Da li sam bio sjeckan?
Neuspješni upisi:/var/log/messages
prošle, w, uptime
/Etc/passwd promijenilo?
fuser za luke
portscans u izvještaju server
čudno obrada Drobljenje CPU?