UNIX з'яўляецца надзвычай папулярнай платформай для разгортвання сервернага праграмнага забеспячэння збольшага з-за яго бяспеку і стабільнасць, але і таму, што ён мае багаты набор каманднага радка і сцэнараў. Праграмісты выкарыстоўваюць гэтыя прылады для працы з файлавай сістэмай, апрацоўкі лог-файлаў, і ў цэлым аўтаматызацыі як мага больш.
Калі вы хочаце быць сур'ёзнымі распрацоўніка сервера, вы павінны будзеце мець пэўныя аб'екты з лікам інструментаў UNIX, каля 15. Вы пачнеце бачыць, што падабенства паміж імі, у прыватнасці, рэгулярныя выразы, і неўзабаве вы будзеце адчуваць сябе вельмі камфортна. Камбінуючы простыя каманды, вы можаце пабудаваць вельмі магутны інструмент вельмі хутка - значна хутчэй, чым вы маглі б пабудаваць аналагічную функцыянальнасць ў C або Java, напрыклад.
Гэтая лекцыя праходзіць праз асноўныя каманды і затым паказвае вам, як аб'яднаць іх у простыя шаблоны або ідыёмы, каб забяспечыць складаныя функцыі, як гистограммирования. Гэтая лекцыя мяркуе, што вы ведаеце, што абалонка і што ў вас ёсць знаёмы з UNIX.
[Дарэчы, гэтая старонка атрымлівае вялікую ўвагу ў сетцы і, на жаль я атрымліваю пошту з вялікай колькасцю людзей, якія маюць лепшыя рашэння або матэрыял, які я хацеў бы дадаць. Я толькі паказваць, што я даведаўся ад прагляду добрых людзей UNIX так што я не кажу, што гэтыя парады аптымальных рашэнняў. Я б вельмі невежественны сістэмнага адміністратара.]
Першае, што трэба ведаць, што UNIX заснаваная на ідэі патоку. Усе струмень, або, як уяўляецца. Драйверы прыладаў выглядаць патокаў, тэрміналы выглядаць патокі, працэсы зносін праз патокі, і г.д... Уваход і выхад з праграмы патокі, якія можна перанакіраваць у прыладу, файл, ці іншую праграму.
Вось прыклад прылады, нулявы прылада, што дазваляе кідаць выхад прэч. Напрыклад, вы можаце запусціць праграму, але ігнараваць выснова.
$ ls > /dev/null # ignore output of ls
дзе "# ігнараваць выхад Ls" з'яўляецца каментарам.
Большасць камандамі ў гэтым працэсе STDIN лекцыі і адправіць вынік на стандартны вывад. Такім чынам, вы можаце паступова працэс патоку дадзеных з дапамогай падключэння выхад аднаго інструмента да іншага ўваходу праз трубу. Напрыклад, наступныя вадаправоднай паслядоўнасць друкуе колькасць файлаў у бягучым каталогу змяненне ў жніўні.
$ ls -l | grep Aug | wc -l
Уявіце, як доўга ён будзе лічыць вас пісаць эквівалентна C або Java-праграму. Вы можаце стаць надзвычай прадуктыўным UNIX праграміста, калі вы навучыцеся спалучаць простыя прылады каманднага радка. Нават пры праграмаванні на ПК, я выкарыстоўваю UNIX Shell МКС і каманды бібліятэкі, каб яна выглядала як скрынка UNIX. Варта наяўнымі.
Калі вам трэба ведаць аб камандзе, папытаеце "чалавек" старонкі. Напрыклад, каб даведацца пра Ls каманды, тыпу
$ man ls
LS(1) System General Commands Manual LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [-ACFLRSTWacdfgiklnoqrstux1] [file...]
DESCRIPTION
Для кожнага аперанда, у імёнах файла тып, выдатны ад каталога, Ls
...
Вы атрымаеце рэзюмэ каманды і любых аргументаў.
Калі вы не можаце ўспомніць імя каманды, паспрабуйце выкарыстоўваць нагоды якая знаходзіць каманд і бібліятэчных падпраграм, звязаных з гэтым словам. Напрыклад, каб даведацца, як рабіць кантрольныя сумы, тыпу
$ apropos checksum cksum(1), sum(1) - display file checksums and block counts md5(1) - calculate a message-digest fingerprint (checksum) for a file
Цэтлік для вас хатні каталог, /home/ імя карыстальніка, складае ~ імя карыстальніка. Напрыклад, ~ parrt мой хатні каталог, /home/parrt.
Пры выкарыстанні абалонкі, ёсць паняцце бягучай дырэкторыі. Кропка '.' сімвал скарачэнне для бягучага каталога і '..' гэта скарачэнне для каталога вышэй бягучага. Такім чынам, каб доступ да файлаў выпрабаванні ў бягучым каталогу. /test жа, як і просты тэст. Калі выпрабаванне каталог вышэй, выкарыстоўваць ../выпрабаванне.
/ З'яўляецца каранёвай каталог, няма характарыстыкі жорсткіх дыскаў у UNIX.
. Bash_profile файл вельмі важна, паколькі гэта, як ваша абалонка сесіі ініцыялізуецца уключаючы вашыя ўсе важныя CLASSPATH Пераменная асяроддзя. Ваш Баш ініцыялізацыі абалонкі файл ~ імя карыстальніка / наступнае. Bash_profile і стварыў падобны код:
PATH=$PATH:$HOME/bin
Як правіла, вы будзеце ехаць у і ўсталяваць CLASSPATH так, што вы не павінны ўсталяваць усё гэта час.
export CLASSPATH=".:/home/public/cs601/junit.jar"
Экспарту азначае, што заданне CLASSPATH бачная ўсе даччыныя працэсы (гэта значыць, бачныя для ўсіх праграм запуску з каманднага радка).
Змяненне каталога ажыццяўляецца з CD каталог, дзе каталог можа быць "." ці ".." перайсці да бягучай дырэкторыі (нічога не рабіць) або ісці каталога.
Паказаць файлы ў каталогу з Ls. L-функцыя выкарыстоўваецца для адлюстравання звестак аб файлах:
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 ...
"Персанал" з'яўляецца група parrt's.
Калі вы хочаце ўбачыць скрытыя файлы (тыя, пачынаючы з "."), выкарыстоўваць "".
Камбінацыі: выкарыстоўваць "LS-ла", каб убачыць падрабязную інфармацыю аб усіх файлаў, уключаючы скрытыя.
Ёсць 4 карысных спосабаў адлюстравання змесціва або часткі файла. Па-першае, вельмі часта выкарыстоўваюцца каманды кат. Напрыклад, для адлюстравання маім спісе аб'ектна-арыентаваных ключавых словаў, якія выкарыстоўваюцца ў гэтым курсе, тыпу:
$ Коткі/home/public/cs601/oo.keywords.txt
Калі файл сапраўды вялікі, верагодна, вы захочаце выкарыстоўваць больш, што плюе файл у экран памерам кавалкаў.
$ Больш падрабязна/VAR/Часопіс/mail.log
Калі вы хочаце бачыць толькі першыя некалькі радкоў файла ці некалькі апошніх радкоў выкарыстоўваць галаву і хвост.
$ Галовы/VAR/Часопіс/mail.log $ Хвост/VAR/Часопіс/mail.log
Вы можаце пазначыць лік у якасці аргументу, каб атрымаць пэўную колькасць ліній:
$ Галаву -30/VAR/Часопіс/mail.log
Найбольш карысна загавор хвост друкуе апошнія некалькі радкоў файла, а затым чакае, друкаванне новых ліній, як яны дадаюцца ў файл. Гэта выдатна падыходзіць для прагляду файла часопіса:
$ Хвост-F/VAR/Часопіс/mail.log
Калі вам трэба даведацца, колькі сімвалаў, слоў ці радкоў у файл, выкарыстоўваць прыбіральню:
$ WC/VAR/Часопіс/mail.log
164 2916 3789 6/VAR/Часопіс/mail.log
Дзе нумара, з тым, лініі, словы, то сімвалы. Для яснасці, вы можаце выкарыстоўваць WC-L Каб надрукаваць толькі колькасць радкоў.
Замест CD можна выкарыстоўваць pushd для захавання бягучай дырэкторыі, а затым аўтаматычна CD у ўказаны каталог. Напрыклад,
$ pwd /Users/parrt $ pushd /tmp /tmp ~ $ pwd /tmp $ popd ~ $ pwd /Users/parrt
Для прагляду дынамічнага адлюстравання працэсаў на вашым кампутары ў дзеянні, выкарыстоўвайце зверху.
Для друку (шырокі экран) усе працэсы, запушчаныя на акне, выкарыстоўвайце PS auxwww.
Для змены прывілеяў файла ці каталога, выкарыстанне CHMOD. Прывілеі 3 лічбы васьмярковым словы з 3 бітамі на лічбы: rwxrwxrwx, дзе першая лічба для ўладальніка файла, другая для групы, і 3 для ўсіх. 644 з'яўляецца агульны файл значэнне слова, які азначае 110100100 або RW-R - г -. Калі вы робіце LS-L, вы ўбачыце гэтыя біты. 755 гэта агульнае значэнне словы для каталогаў: ўсталёўваецца ўладальнікамі-XR-х, дзе каталогі павінны быць выкананы файл для CD, каб мець магчымасць увайсці ў гэты каталог. 755 гэта скарачэнне для больш чытэльным аргументу U = RWX, перайдзіце = RX. і з'яўляецца карыстальнік, G з'яўляецца групай, аб інш.
Выкарыстоўвайце CHMOD-R для рэкурсіўнага прымянення для ўсіх каталогаў ніжэй аргумент.
Адной з найбольш карысных інструментаў, даступных на UNIX і той, які вы можаце выкарыстоўваць больш за ўсё GREP. Гэты інструмент матчах рэгулярных выразаў (які ўключае ў сябе простыя словы) і выводзіць супадаючыя радкі на стандартны вывад.
Найпросты загавор шукае пэўную паслядоўнасць знакаў у набор файлаў. Вось прыклад, які шукае любыя спасылкі на сістэмы ў Java-файлы ў бягучым каталогу.
GREP сістэмы *. Java
Вы можаце знайсці кропку '.' рэгулярнае выраз карысна. Яна адпавядае любому знаку, але, як правіла, у спалучэнні з зоркай, якая адпавядае нуля або больш з папярэдняга пункта. Будзьце асцярожныя, каб заключыць выраз у двукоссі так каманднага радка пашырэнне не змяняе аргумент. У наступным прыкладзе, шукае спасылкі на любой старонцы форуму ў лог-файл сервера:
$ grep '/forum/.*' /home/public/cs601/unix/access.log
або, што эквівалентна:
$ cat /home/public/cs601/unix/access.log | grep '/forum/.*'
Другая форма карысная, калі вы хочаце, каб працэс набору файлаў, як адзіны паток, як ў:
cat /home/public/cs601/unix/access*.log | grep '/forum/.*'
If you need to look for a string at the beginning of a line, use caret '^':
$ grep '^195.77.105.200' /home/public/cs601/unix/access*.log
Гэта знаходзіць ўсе радкі ва ўсіх часопісаў доступу, якія пачынаюцца з IP-адрасам 195.77.105.200.
Калі вы хочаце, каб інвертаваць шаблоне, каб знайсці радкі, якія не адпавядаюць шаблоне, выкарыстоўваць-V. Вось прыклад, які знаходзіць спасылкі на малюнкі, не атрымлівае ў лог-файле:
$ cat /home/public/cs601/unix/access.log | grep -v '/images'
Цяпер уявіце, што ў вас ёсць файл часопіса HTTP і вы хацелі б, каб адфільтраваць старонкі просьбы нечалавечым павукоў. Калі ў вас ёсць файл з імем spider.IPs, вы можаце знайсці ўсё праглядаў старонак nonspider праз:
$ cat /home/public/cs601/unix/access.log | grep -v -f /tmp/spider.IPs
Нарэшце, каб ігнараваць выпадку ўваходны паток, выкарыстоўвайце-я.
Морфинг тэкставы паток з'яўляецца адным з асноўных аперацыі UNIX. PERL з'яўляецца добрым інструментам для гэтага, але так як я не люблю PERL я прытрымлівацца трох інструментаў: TR, СЕПГ, і AWK. PERL і гэтыя прылады радок за радком, што яны добра працуюць толькі на мадэлі цалкам знаходзіцца ў адной радку. Калі вам неабходна апрацоўваць больш складаныя мадэлі, як XML або вам трэба разабраць мова праграмавання, выкарыстання кантэкстнае-свабоднай граматыкі інструмент, як ANTLR.
Для маніпулявання прабелы, вы знойдзеце tr вельмі карысна.
Калі ў вас ёсць слупкі дадзеных, падзеленых прабеламі, і вы хацелі б слупкоў, каб згарнуць так што адзін слупок дадзеных, скажыце tr замяніць прастору з '\ п' радкі TR '. Разгледзім файл уводу / home/public/cs601/unix/names:
Джым Майк Скот Том Біл Рэндзі
Каб атрымаць усе гэтыя імёны ў слупку, выкарыстоўвайце
$ cat /home/public/cs601/unix/names | tr ' ' '\n'
Калі вы хочаце, каб згарнуць усё паслядоўнасцяў прастор ў адно прастору, 'выкарыстоўваць TR-S ".
Каб пераўтварыць файл у кампутары UNIX, вы павінны пазбавіцца ад знакаў '\ г'. Выкарыстоўвайце TR-D '\ г'.
Калі падзенне або перакладаць асобныя сімвалы не дастаткова, вы можаце выкарыстоўваць SED (струменевае рэдактар) для замены або выдалення тэксту кавалкі суправаджацца рэгулярнымі выразамі. Напрыклад, каб выдаліць усе спасылкі на словы Скота ў імёны файлаў з вышэй, выкарыстанне
$ cat /home/public/cs601/unix/names | sed 's/scott//'
які замяняе Скот ні за што. Калі Ёсць некалькі спасылак на Скота на адной радку, выкарыстоўвайце г суфікс для абазначэння "глабальных" на гэтай лініі ў адваротным выпадку толькі першае ўваходжанне будуць выдаленыя:
$... | sed 's/scott//g'
Калі вы хацелі б замяніць спасылкі на view.jsp з index.jsp, выкарыстоўвайце
$... | sed 's/view.jsp/index.jsp/'
хачу. ASP Калі файл пераўтворыцца. Вы JSP, Вы павінны супадаць з імем файла з дапамогай рэгулярнага выказвання і спасылацца на яго праз \ 1:
$... | sed 's/\(.*\).asp/\1.jsp/'
The \(...\) grouping collects text that you can refer to with \1.
Калі вы хочаце, каб забіць ўсе, ад ',' сімвал канца радка, выкарыстоўвайце канец лініі маркера $:
$... | sed 's/,.*$//' # kill from comma to end of line
Калі вам трэба для працы з Стаўбцоў дадзеных або выканаць невялікі фрагмент кода для кожнай радкі, супадальныя з шаблонам, выкарыстоўваючы AWK. AWK праграмы шаблон-дзеянне пар. Хоць некаторыя AWK праграмы досыць складана патрабаваць асобны файл, які змяшчае праграму, вы можаце рабіць дзіўныя рэчы, выкарыстоўваючы аргумент каманднага радка.
AWK лічыць ўваходных ліній разбіты на поля (гэта значыць, калоны) асобныя прабеламі. Поля на якія спасылаюцца ў дзеянне праз $ 1, $ 2,... у той час як $ 0 спасылаецца на ўсю радок уводу.
Шаблон-дзеянне пара выглядае наступным чынам:
шаблён {дзеянне}
Калі вы апусціце карціна, дзеянне выконваецца для кожнай уваходнай радка. Апускаючы дзеяння азначае, друк лініі. Вы можаце асобных пар новай радкі або кропкай з коскі.
Разгледзім ўвод
aasghar Асгар Алі wchen Chen, Wei zchen Чэн, Чжэнь-Цзянь
Калі вы хочаце спіс Лагін імёны, спытаеце AWK для друку першага слупка:
$ cat /home/public/cs601/unix/emails.txt | awk '{print $1;}'
Калі вы хочаце канвертаваць Увайсці імёны на адрасы электроннай пошты, выкарыстанне Е С-падобнай функцыі:
$ cat /home/public/cs601/unix/emails.txt | awk '{printf("%s@cs.usfca.edu,",$1);}'
З-за адсутнасці \ п ў Е радкі, вы ўбачыце выхад усё на адной лініі, для ўстаўкі ў паштовай праграме:
aasghar@cs.usfca.edu,wchen@cs.usfca.edu,zchen@cs.usfca.edu
Вы таксама можаце змяніць парадак слупкоў дадзеных. Каб надрукаваць імя, прозвішча, вы можаце паспрабаваць:
$ cat /home/public/cs601/unix/emails.txt | awk '{printf("%s %s\n", $3, $2);}'
але вы заўважыце, што коска ўсё яшчэ там, як яна з'яўляецца часткай рубрыкі:
Ali Asghar, Wei Chen, Zhen-Jian Chen,
Вы павінны труба выводзіцца праз Tr (або СЭД) у паласе коскі:
$ cat /home/public/cs601/unix/emails.txt | \
awk '{printf("%s %s\n", $3, $2);}' | \
tr -d ','
Тады вы ўбачыце:
Ali Asghar Wei Chen Zhen-Jian Chen
Вы можаце таксама выкарыстоўваць AWK вывучыць значэнне ўтрымання. Падводзячы вынікі першай калонцы наступныя дадзеныя (in file /home/public/cs601/unix/coffee):
3 parrt 2 jcoker 8 tombu
выкарыстоўваць наступную простую каманду:
$ awk '{n+=$1;} ; END {print n;}' < /home/public/cs601/unix/coffee
дзе канец спецыяльны шаблон, які азначае "пасля апрацоўкі патоку".
Калі вы хочаце, каб фільтр або сума ўсіх значэнняў менш або роўная, скажам, 3, выкарыстанне заяву, калі:
$ awk '{if ($1<=3) n+=$1;} END {print n;}' < /home/public/cs601/unix/coffee
У гэтым выпадку, вы ўбачыце выхад 5 (3 +2);
Выкарыстаньне AWK, каб захапіць пэўны слупок вельмі часта пры апрацоўцы файлаў часопісаў. Разгледзім http://www.jguru.com старонцы прагляду файла часопіса, / home/public/cs601/unix/pageview-20021022.log, якія маюць выгляд:
date-stamp(thread-name): userID-or-IPaddr URL site-section
So, the data looks like this:
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 ...
Калі карыстальнік увайшоў у сістэму, файл часопіса мае свой ідэнтыфікатар карыстальніка, а не іх IP-адрасы.
Вось як вы атрымаеце спіс URL-адрасоў, што людзі лічаць, што кажуць пра 22 Кастрычніка 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
...
Калі Вы жадаеце палічыць, колькі старонак было ў той дзень, якія не былі апрацоўкі старонак (мой апрацоўкі старонак ўсе формы process_ XXX), трубы вынікаў пасродкам GREP і туалет:
$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log | \
grep -v process | \
wc -l
67850
Калі вы хочаце унікальны спіс URL-адрасоў, вы можаце сартаваць выхаду, а затым выкарыстоўваць Uniq:
$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log | \
sort | \
uniq
Uniq проста бурыцца ўсе паўторныя радкі ў адну лінію - вось чаму неабходна адсартаваць выхад у першую чаргу. Вы атрымаеце выхад, як:
/article/index.jsp /article/index.jsp?page=1 /article/index.jsp?page=10 /article/index.jsp?page=2 ...
Заўвага: назва паходзіць ад аналагічнага словы, Hairball (рэчы, што коткі кінуць), я ўпэўнены.
Каб збіраць кучу файлаў і каталогаў разам, выкарыстанне смалы. Напрыклад, для смол увесь ваш хатні каталог і змясціце архіў у / TMP, зрабіць гэта
$ cd ~parrt $ cd.. # go one dir above dir you want to tar $ tar cvf /tmp/parrt.backup.tar parrt
Паводле пагаднення, выкарыстанне. Смалы, як пашырэнне. Для распакуйце гэты файл выкарыстоўваць
$ cd /tmp $ tar xvf parrt.backup.tar
смалы untars рэчы ў бягучым каталогу!
Пасля запуску распакуйце, вы знойдзеце новы каталог, / TMP/parrt, які з'яўляецца копіяй вашага хатняга каталога. Адзначым, што, як толькі рэчы смалы да дыктуе структуру каталогаў, калі untarred. Той факт, што я згадваў у parrt смалы стварэнне азначае, што ў мяне будзе, што, калі untarred рэж. У супрацьлегласць гэтаму, наступным будзе таксама зрабіць копію маёй хатняй дырэкторыі, але без parrt реж корань:
$ cd ~parrt $ tar cvf /tmp/parrt.backup.tar *
Гэта добрая ідэя, каб смала рэчы з каранёвай каталогу так, што калі вы распакуйце вы не генеруюць млн. файлаў у бягучай непасрэдна. Каб убачыць, што ў архіве, выкарыстоўвайце
$ tar tvf /tmp/parrt.backup.tar
Большую частку часу вы можаце зэканоміць прастору з дапамогай Z аргумент. Архіў затым будзе GZIP "D і вы павінны выкарыстоўваць пашырэнне файла tar.gz.:
$ cd ~parrt $ cd.. # go one dir above dir you want to tar $ tar cvfz /tmp/parrt.backup.tar.gz parrt
Разархивировании патрабуе Z аргумент таксама:
$ cd /tmp $ tar xvfz parrt.backup.tar.gz
Калі ў вас ёсць вялікі файл для сціску, выкарыстання GZIP:
$ gzip bigfile
Пасля выканання, Ваш файл будзе перайменаваны bigfile.gz. Каб распакаваць, выкарыстоўвайце
$ gzip -d bigfile.gz
Каб адлюстраваць тэкставы файл, які ў цяперашні час выкарыстоўваюць zcat GZIP 'D,:
$ zcat bigfile.gz
Калі ў Вас павінен быць каталог на адным кампутары, прадубляваныя на іншай машыне, выкарыстоўваць Rsync. Ён параўноўвае ўсе файлы ў поддереве каталогаў і капіюе любыя, якія былі зменены з люстраной каталога на іншай машыне. Напрыклад, вось як вы маглі б "пацягнуць" усё часопісы файлаў з livebox.jguru.com ў акно, з якога вы выконваеце Rsync каманду:
$ hostname jazz.jguru.com $ rsync -rabz -e ssh -v 'parrt@livebox.jguru.com:/var/log/jguru/*' \ /backup/web/logs
Rsync будзе выдаліць або ўсячэнне файлаў для забеспячэння файлы застаюцца тымі ж. Гэта дрэнна, калі вы выдаляеце файл па памылку - ён знішчыць вашыя файла рэзервовай копіі. Дадаць аргумент завецца - суфікс сказаць Rsync, каб зрабіць копію любога існуючага файла, перш чым ён перапісвае гэта:
$ hostname jazz.jguru.com $ rsync -rabz -e ssh -v --suffix.rsync_`date '+%Y%m%d'` \ 'parrt@livebox.jguru.com:/var/log/jguru/*' /backup/web/logs
where `date '+%Y%m%d'` (in reverse single quotes) means "execute this date command".
Каб выключыць пэўныя шаблоны ад сінхранізацыі, выкарыстоўвайце - выключыць:
$ rsync -rabz --exclude=entitymanager/ --suffix.rsync_`date '+%Y%m%d'` \ -e ssh -v 'parrt@livebox.jguru.com:/var/log/jguru/*' /backup/web/logs
Каб скапіяваць файл ці каталог уручную, выкарыстоўваючы SCP:
$ scp lecture.html parrt@nexus.cs.usfca.edu:~parrt/lectures
Гэтак жа, як СР, выкарыстоўвайце-г, каб скапіяваць каталог рэкурсіўна.
Большасць графічных інтэрфейсаў для Linux або ПК маюць пошукавую сістэму, але з каманднага радка вы можаце выкарыстоўваць пошук. Каб знайсці ўсе файлы з імем выкарыстання. P4 пачынаючы ў каталогу ~/ANTLR/склад/праектаў:
$ find ~/antlr/depot/projects -name '.p4'
Па змаўчанні "дзеянні" да друку.
Вы можаце пазначыць рэгулярнае выраз, каб адпавядаць. Напрыклад, каб паглядзець пад хатні каталог для любой XML-файлы, выкарыстоўваць:
$ find ~ -name '*.xml' -print
Звярніце ўвагу на выкарыстанне адзінарных двукоссяў для прадухілення каманднага радка пашырэння - Вы хочаце, '*', каб перайсці да знайсці каманду.
Вы можаце выканаць каманду для кожнага файла ці каталога выявілі, што адпавядае назве. Напрыклад, не выдаліць усе файлы XML, выканайце наступныя дзеянні:
$ find ~ -name '*.xml' -exec rm {} \;
дзе "{}" азначае "бягучы файл, які адпавядае". У канцы каманда павінна быць спыненая з "," але з-за пашырэння каманднага радка, вам трэба бегчы ';'.
Вы таксама можаце паказаць інфармацыю аб часе ў запыце. Вось скрыпт, які выкарыстоўвае знайсці, каб выдаліць усе файлы старэй 14 дзён.
#!/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 {} \;
Калі вы хочаце ведаць, хто выкарыстоўвае порт, такіх як HTTP (80), выкарыстанне термоблока. Вы павінны быць суперпользователем, каб выкарыстоўваць гэта:
$ 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
Выхад паказвае спіс працэсаў, звязаных з гэтым портам.
Часам вы хочаце выкарыстоўваць каманду, але гэта не ў вашым шляху, і вы не можаце ўспомніць, дзе гэта. Выкарыстоўвайце выдала шукаць у стандартных месцах UNIX для каманды.
$ 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
выдала таксама паказвае чалавеку старонак.
Часам можа быць запушчана з няправільнай версіі каманды, і вы хочаце ведаць, якую версію вашай каманды PATH паказвае павінен быць запушчаны. Выкарыстоўвайце якая спытаць:
$ which ls
alias ls='ls --color=tty'
/bin/ls
$ which java
/usr/local/java/bin/java
If nothing is found in your path, you'll see:
$ 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)
Для перадачы сігналу ў працэсе выкарыстання забіць. Звычайна вы хочаце, каб проста сказаць забіць PID дзе PID можа быць знойдзены з PS або зверху (гл. ніжэй).
Выкарыстоўвайце забіць -9 PID, калі вы не можаце атрымаць працэсу, каб памерці, а гэта значыць забіць яе "крайняй шкоды".
Калі ў вас узніклі праблемы пры атрыманні на сайце, выкарыстоўваць трасіроўку глядзець паслядоўнасць хмеля выкарыстоўваецца для атрымання на сайце:
$ /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 ...
$ /sbin/ifconfig
Пад інтэрфейсам eth0, вы ўбачыце інэт адрас:
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
...
Калі вы хочаце, каб забіць ўсе працэсы, запушчаныя Java для parrt, вы можаце альбо запускаць killall Java, калі вы parrt або генерыраваць "забіць" скрыпт:
$ ps auxwww|grep java|grep parrt|awk '{print "kill -9 ",$2;}' > /tmp/killparrt
$ bash /tmp/killparrt # run resulting script
The /tmp/killparrt file would look something like:
kill -9 1021 kill -9 1023 kill -9 1024
Заўвага: Вы таксама можаце зрабіць гэта агульная задача з:
$ killall java
Памятайце, што гэта Linux канкрэтных; мне сказалі, што ён будзе забіваць усіх перапрацоўкі на UNIXen як Solaris!
Гістаграма мноства граф, кошт пары паказвае, як часта адбываецца значэнне. Асноўныя аперацыі будзе для сартавання, то палічыце, колькі значэнняў адбываюцца ў шэраг, а затым зваротную сартаванне так што значэнне з высокім лічыльнік ў верхняй частцы справаздачы.
$... | sort |uniq -c|sort -r -n
Адзначым, што сартаваць сартаваць па ўсёй лініі, а першы слупок, відавочна, значнае як першая літара ў прозвішчы хто-то значна пазіцыі яго імя ў адсартаваны спіс.
Uniq-C руйнуецца ўсё паўтараюцца паслядоўнасці значэнняў, але друкуе лік з'яўленняў перад значэннем. Нагадаем, папярэдні сартаванне:
$ 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
...
Now add -c to 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
...
Цяпер усё, што вам трэба зрабіць, гэта зваротны парадак сартавання лініі ў адпаведнасці з першай калонцы лікава.
$ 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
...
На практыцы, вы можаце атрымаць гістаграму, якая была "despidered" і толькі пытанні і адказы звязаныя праглядаў. Вы можаце адфільтраваць усе старонкі лініі гледжання, звязаных з павуком КП і фільтр толькі ў FAQ радкі:
$ 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
...
Калі вы хочаце бачыць толькі despidered FAQ старонак, якія былі паказаны больш чым у 500 раз, дадаць AWK каманду да канца.
$ 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
Студэнт спытаў, калі я ведаў праграмы, якая дыяграмы класаў іерархіі. Я сказаў "не", але потым зразумелі, што нам не патрэбен. Вось адзін лайнер, каб зрабіць гэта:
# 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 "}"}'
Яна спараджае DOT графа файлы фармату. Паспрабуйце гэта. Гэта дзіўна. Работы ў большасці выпадкаў. Выхад выглядае наступным чынам:
digraph foo {
antlr.CharScanner->JavaLexer
antlr.LLkParser->Mantra
->TestLexer
}
Я хацеў бы аўтаматызаваць як мага больш. Часам гэта азначае, што напісаць праграму, якая спараджае іншую праграму або сцэнар.
Я хацеў атрымаць паслядоўнасць каманд SQL, якія абнаўляем нашу базу даных электроннай пошты, калі хто-то адскочыў. Апрацоўка пошты файл даволі лёгка, так як вы можаце паглядзець на код памылкі вынікаюць адрас электроннай пошты. Адскочыў электроннай пошты выглядае наступным чынам:
From MAILER-DAEMON@localhost.localdomain 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 <notifications@jguru.com>; 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 <MAILER-DAEMON@web.jguru.com>
Message-Id: <200201100132.g0A1W2o02285@web.jguru.com>
To: <notifications@jguru.com>
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 -----
<pain@intheneck.com>
(reason: 550 Host unknown)
----- Transcript of session follows -----
550 5.1.2 <pain@intheneck.com>... Host unknown (Name server: intheneck.com: host not found)
...
Звярніце ўвагу на SMTP 550 паведамленне пра памылку. Шукайце, што ў пачатку лініі, то забіваць кутніх дужках, выдаліць ... і выкарыстаць AWK раздрукаваць 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
Я павінен бегчы $ 3, паколькі гэта азначае што-то атачаюць скрыпт Bash, і я хачу AWK, каб убачыць знак даляра.
#!/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
Няўдалыя спробы ўваходу:/var/log/messages
Апошняе, W, праведзены на сайце
/etc/passwd змяніць?
Термоблока для портаў
сканаванні партоў ў сэрвэры справаздач
дзіўна працэсар коробления апрацоўкі?Popular Links