Back to site

Як выглядаць UNIX гуру

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

Змяненне каталога ажыццяўляецца з CD каталог, дзе каталог можа быць "." ці ".." перайсці да бягучай дырэкторыі (нічога не рабіць) або ісці каталога.

Ls

Паказаць файлы ў каталогу з 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 Каб надрукаваць толькі колькасць радкоў.

pushd, popd

Замест CD можна выкарыстоўваць pushd для захавання бягучай дырэкторыі, а затым аўтаматычна CD у ўказаны каталог. Напрыклад,

$ pwd
/Users/parrt
$ pushd /tmp
/tmp ~
$ pwd
/tmp
$ popd
~
$ pwd
/Users/parrt

top

Для прагляду дынамічнага адлюстравання працэсаў на вашым кампутары ў дзеянні, выкарыстоўвайце зверху.

PS

Для друку (шырокі экран) усе працэсы, запушчаныя на акне, выкарыстоўвайце PS auxwww.

CHMOD

Для змены прывілеяў файла ці каталога, выкарыстанне 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 замяніць прастору з '\ п' радкі TR '. Разгледзім файл уводу / home/public/cs601/unix/names:

Джым Майк Скот
Том Біл Рэндзі

Каб атрымаць усе гэтыя імёны ў слупку, выкарыстоўвайце

$ cat /home/public/cs601/unix/names | tr ' ' '\n'

Калі вы хочаце, каб згарнуць усё паслядоўнасцяў прастор ў адно прастору, 'выкарыстоўваць TR-S ".

Каб пераўтварыць файл у кампутары UNIX, вы павінны пазбавіцца ад знакаў '\ г'. Выкарыстоўвайце TR-D '\ г'.

SED

Калі падзенне або перакладаць асобныя сімвалы не дастаткова, вы можаце выкарыстоўваць 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 праграмы досыць складана патрабаваць асобны файл, які змяшчае праграму, вы можаце рабіць дзіўныя рэчы, выкарыстоўваючы аргумент каманднага радка.

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

Калі ў Вас павінен быць каталог на адным кампутары, прадубляваныя на іншай машыне, выкарыстоўваць 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:

$ 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, калі вы не можаце атрымаць працэсу, каб памерці, а гэта значыць забіць яе "крайняй шкоды".

Traceroute

Калі ў вас узніклі праблемы пры атрыманні на сайце, выкарыстоўваць трасіроўку глядзець паслядоўнасць хмеля выкарыстоўваецца для атрымання на сайце:

$ /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
...

Што такое IP-адрас?

$ /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

Стварэнне Java дыяграмы іерархіі класаў

Студэнт спытаў, калі я ведаў праграмы, якая дыяграмы класаў іерархіі. Я сказаў "не", але потым зразумелі, што нам не патрэбен. Вось адзін лайнер, каб зрабіць гэта:

# 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

Published (Last edited): Apr 6 , source: http://www.cs.usfca.edu/~parrt/course/601/lectures/unix.util.html