Cara Lihat Like A UNIX Guru

Terence Parr

Terakhir diperbarui: 30 Agustus 2006

UNIX adalah platform yang sangat populer untuk menyebarkan perangkat lunak server sebagian karena keamanan dan stabilitas, tetapi juga karena memiliki seperangkat baris perintah dan alat scripting.Programmer menggunakan alat ini untuk memanipulasi sistem file, pengolahan file log, dan umumnya mengotomatisasi sebanyak mungkin.

Jika Anda ingin menjadi seorang pengembang server yang serius, Anda akan perlu memiliki fasilitas tertentu dengan sejumlah alat UNIX; sekitar 15. Anda akan mulai melihat kesamaan antara mereka, ekspresi khususnya biasa, dan segera Anda akan merasa sangat nyaman. Menggabungkan perintah sederhana, Anda dapat membangun alat yang sangat kuat yang sangat cepat - jauh lebih cepat dari yang Anda bisa membangun fungsi setara di C atau Java, misalnya.

Kuliah ini akan membawa Anda melalui perintah dasar dan kemudian menunjukkan Anda bagaimana untuk menggabungkan mereka dalam pola sederhana atau idiom untuk menyediakan fungsionalitas canggih seperti histogramming. Kuliah ini mengasumsikan Anda tahu apa shell adalah dan bahwa Anda memiliki beberapa keakraban dasar dengan UNIX.

[By the way, halaman ini mendapat banyak perhatian di internet dan sayangnya saya mendapatkan email dari banyak orang yang memiliki solusi yang lebih baik atau hal-hal yang saya harus menambahkan.Aku hanya menunjukkan apa yang telah saya pelajari dari menonton orang UNIX yang baik sehingga saya tidak mengatakan tips ini adalah solusi optimal. Aku akan membuat admin sys cukup bodoh.]

Semuanya sungai

Hal pertama yang perlu Anda ketahui adalah bahwa UNIX didasarkan pada gagasan aliran . Semuanya adalah aliran , atau tampaknya. Driver perangkat terlihat seperti sungai, terminal terlihat seperti sungai, proses berkomunikasi melalui sungai, dll ... input dan output dari sebuah program yang aliran yang dapat Anda mengarahkan ke perangkat, file, atau program lain.

Berikut adalah perangkat contoh, perangkat nol, yang memungkinkan Anda membuang keluaran pergi. Misalnya, Anda mungkin ingin menjalankan program tetapi mengabaikan output.

$ ls > /dev/null # ignore output of ls

mana " # mengabaikan output ls " adalah komentar.

Sebagian besar perintah tercakup dalam proses kuliah ini stdin dan mengirim hasilnya ke stdout . Dengan cara ini, Anda secara bertahap dapat memproses aliran data dengan mengaitkan output dari satu alat untuk masukan dari yang lain melalui pipa . Misalnya, urutan pipa berikut mencetak jumlah file dalam direktori saat ini diubah pada bulan Agustus.

$ ls -l | grep Aug | wc -l

Bayangkan berapa lama akan membawa Anda untuk menulis setara C atau program Java. Anda bisa menjadi seorang programmer UNIX sangat produktif jika Anda belajar untuk menggabungkan alat baris perintah sederhana. Bahkan ketika pemrograman di PC, saya menggunakan MKS UNIX shell dan perintah perpustakaan untuk membuatnya terlihat seperti sebuah kotak UNIX. Layak uang tunai.

Mendapatkan bantuan

Jika Anda perlu tahu tentang perintah, meminta halaman "man". Misalnya, untuk mencari tahu tentang ls perintah, ketik

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

Anda akan mendapatkan ringkasan dari perintah dan argumen.

Jika Anda tidak dapat mengingat nama perintah, coba gunakan apropos yang menemukan perintah dan rutinitas perpustakaan yang terkait dengan kata itu. Misalnya, untuk mengetahui bagaimana melakukan checksum, jenis

$ apropos checksum
cksum(1), sum(1)         - display file checksums and block counts
md5(1)                   - calculate a message-digest fingerprint (checksum) for a file

Direktori khusus dan file

Lihat @ http://www.thegeekstuff.com/2010/09/linux-file-system-structure

Sebuah jalan pintas untuk Anda direktori home, / home / nama pengguna , adalah ~ nama pengguna . Misalnya, ~ parrt adalah saya direktori home, / home / parrt .

Bila Anda menggunakan shell, ada gagasan direktori saat . Titik ' . 'Karakter adalah singkatan untuk direktori saat ini dan' .. 'adalah singkatan untuk direktori di atas saat ini. Jadi untuk mengakses berkas tesdi direktori saat ini, ./test adalah sama dengan plain tes . Jika tes adalah sebuah direktori di atas, gunakan ../test .

/ Adalah direktori root; tidak ada spesifikasi berkendara di UNIX.

The .bash_profile file yang sangat penting karena itu adalah bagaimana sesi shell Anda diinisialisasi termasuk pernah-penting Anda CLASSPATH variabel lingkungan. Anda pesta berkas shell inisialisasi ~nama /.bash_profile dan telah menyiapkan kode seperti berikut:

PATH=$PATH:$HOME/bin

Biasanya, Anda akan masuk dan mengatur Anda CLASSPATH sehingga Anda tidak perlu mengatur semuanya waktu.

export CLASSPATH=".:/home/public/cs601/junit.jar"

The ekspor berarti bahwa tugas untuk CLASSPATH dapat dilihat oleh semua proses anak (yaitu, terlihat semua program dijalankan dari shell).

Dasar

CD

Mengubah direktori dilakukan dengan cd dir mana dir bisa "." atau ".." untuk pindah ke direktori saat ini (melakukan apa-apa) atau naik direktori.

ls

Menampilkan file dalam sebuah direktori dengan ls . The l opsi digunakan untuk menampilkan detail dari file:

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

"Staf" adalah kelompok parrt ini.

Jika Anda ingin melihat file yang tersembunyi (yang dimulai dengan "."), Menggunakan "-a".

Kombinasi yang mungkin: menggunakan "ls -la" untuk melihat rincian semua file termasuk yang tersembunyi.

menampilkan file

Ada 4 cara yang berguna untuk menampilkan isi atau bagian dari sebuah file. Yang pertama adalah perintah yang sangat umum digunakan kucing . Misalnya, untuk menampilkan daftar kata kunci berorientasi obyek yang digunakan dalam kursus ini, ketik:

$ cat /home/public/cs601/oo.keywords.txt

Jika file benar-benar besar, Anda mungkin akan ingin menggunakan lebih , yang meludah file dalam potongan ukuran layar.

$ more /var/log/mail.log

Jika Anda hanya ingin melihat beberapa baris pertama dari sebuah file atau beberapa baris terakhir menggunakan kepala dan ekor.

$ head /var/log/mail.log
$ tail /var/log/mail.log

Anda dapat menentukan angka sebagai argumen untuk mendapatkan jumlah tertentu baris:

$ head -30 /var/log/mail.log

Mantra paling berguna dari ekor mencetak beberapa baris terakhir dari file dan kemudian menunggu, mencetak baris baru karena mereka ditambahkan ke file. Ini sangat bagus untuk menonton file log:

$ tail -f /var/log/mail.log

Jika Anda perlu tahu berapa banyak karakter, kata, atau garis dalam file, menggunakan wc:

$ wc /var/log/mail.log
     164    2916   37896 /var/log/mail.log

Di mana jumlahnya, agar, baris, kata, maka karakter. Untuk kejelasan, Anda dapat menggunakan wc -l untuk mencetak hanya jumlah baris.

pushd, popd

Alih-alih cd Anda dapat menggunakan pushd untuk menyimpan dir saat dan kemudian secara otomatis cd ke direktori tertentu. Sebagai contoh,

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

Puncak

Untuk menonton tampilan dinamis dari proses di komputer anda beraksi, gunakan top. 

ps

Untuk mencetak (layar lebar) semua proses yang berjalan pada kotak, penggunaan ps auxwww .

Chmod

Untuk mengubah hak dari file atau direktori, gunakan chmod . Hak istimewa 3 digit oktal kata-kata dengan 3 bit per digit: rwxrwxrwx dimana digit pertama adalah untuk pemilik file, 2 untuk kelompok, dan 3 untuk siapa pun. 644 adalah file nilai kata umum yang berarti 110.100.100 atau rw-r - r--. Ketika Anda melakukan ls-l Anda akan melihat bit ini. 755 adalah nilai kata umum untuk direktori: rwxr-xr-x di mana direktori harus dieksekusi untuk cd untuk dapat masuk ke dir itu. 755 adalah singkatan untuk argumen lebih mudah dibaca u = rwx, pergi = rx . u adalah pengguna, g adalah kelompok, o adalah lainnya.

Gunakan chmod -R untuk rekursif menerapkan untuk semua dirs bawah argumen juga.

Mencari stream

Salah satu alat yang paling berguna yang tersedia pada UNIX dan yang Anda dapat menggunakan yang paling adalah grep . Alat ini cocok ekspresi reguler (yang mencakup kata-kata sederhana) dan mencetak baris yang cocok untuk stdout .

Mantra sederhana mencari urutan karakter tertentu dalam satu set file. Berikut adalah contoh yang terlihat untuk setiap referensi untuk Sistem dalam file java di direktori saat ini.

grep Sistem * .java

Anda mungkin menemukan titik '.' ekspresi reguler berguna. Cocok dengan satu karakter apapun tetapi biasanya dikombinasikan dengan bintang, yang cocok dengan nol atau lebih dari item sebelumnya. Hati-hati untuk menyertakan ekspresi dalam tanda kutip tunggal sehingga ekspansi baris perintah tidak memodifikasi argumen. Contoh berikut, mencari referensi untuk setiap halaman forum dalam file log:

$ Grep '/forum/.*' /home/public/cs601/unix/access.log

atau ekuivalen:

$ Cat /home/public/cs601/unix/access.log | grep '/forum/.*'

Bentuk kedua ini berguna bila Anda ingin mengolah koleksi file sebagai aliran tunggal seperti pada:

cat /home/public/cs601/unix/access*.log | grep '/forum/.*'

Jika Anda perlu mencari string pada awal baris, menggunakan tanda sisipan '^':

$ Grep /home/public/cs601/unix/access*.log '^ 195.77.105.200'

Ini menemukan semua baris dalam semua log akses yang dimulai dengan alamat IP 195.77.105.200.

Jika Anda ingin membalikkan pola pencocokan untuk menemukan baris yang tidak cocok dengan pola, gunakan v . Berikut adalah contoh yang menemukan referensi untuk non citra GET s dalam file log:

$ Cat /home/public/cs601/unix/access.log | grep -v '/ gambar'

Sekarang bayangkan bahwa Anda memiliki file http log dan Anda ingin menyaring permintaan laman yang dibuat oleh laba-laba bukan manusia. Jika Anda memiliki sebuah file yang bernama spider.IPs , Anda dapat menemukan semua tampilan halaman nonspider melalui:

$ Cat /home/public/cs601/unix/access.log | grep -v -f /tmp/spider.IPs

Akhirnya, untuk mengabaikan kasus input stream, gunakan -i .

menerjemahkan aliran

Morphing aliran teks adalah operasi dasar UNIX. PERL adalah alat yang baik untuk ini, tapi karena saya tidak suka PERL Saya tetap dengan tiga alat: tr , sed , dan awk . PERL dan alat-alat ini baris demi baris alat dalam bahwa mereka beroperasi dengan baik hanya pada pola sepenuhnya terkandung dalam satu baris. Jika Anda perlu untuk memproses pola yang lebih rumit seperti XML atau Anda perlu untuk mengurai bahasa pemrograman, menggunakan alat tata bahasa bebas konteks seperti ANTLR .

tr

Untuk memanipulasi spasi, Anda akan menemukan tr sangat berguna.

Jika Anda memiliki kolom data dipisahkan oleh ruang dan Anda ingin kolom runtuh sehingga ada satu kolom data, memberitahu tr untuk menggantikan ruang dengan baris baru tr '' '\ n' . Pertimbangkan file input / home / public / cs601 / unix / nama : 

jim scott mike
bill randy tom

Untuk mendapatkan semua nama-nama dalam kolom, penggunaan

$ Cat / home / public / cs601 / unix / nama | tr '' '\ n'

Jika Anda ingin runtuh semua urutan ruang menjadi satu spasi tunggal, menggunakan tr -s '' .

Untuk mengkonversi file PC ke UNIX, Anda harus menyingkirkan karakter '\ r'. Gunakan tr -d '\ r' .

tapi

Jika menjatuhkan atau menerjemahkan karakter tunggal tidak cukup, Anda dapat menggunakan sed (stream Editor) untuk mengganti atau menghapus potongan teks yang cocok dengan ekspresi reguler.Misalnya, untuk menghapus semua referensi untuk kata scott dalam nama file dari atas, penggunaan

$ Cat / home / public / cs601 / unix / nama | sed 's / scott //'

yang menggantikan scott untuk apa-apa. Jika ada beberapa referensi untuk scott pada satu baris, menggunakan g akhiran untuk menunjukkan "global" pada baris dinyatakan hanya kejadian pertama akan dihapus:

$ ... | sed 's / scott // g'

Jika Anda ingin mengganti referensi untuk view.jsp dengan index.jsp , penggunaan

$ ... | sed 's / view.jsp / index.jsp /'

Jika Anda ingin setiap Asp file yang dikonversi ke jsp , Anda harus sesuai dengan nama file dengan ekspresi reguler dan lihat melalui / 1:

$ ... | sed 's / \ (. * \). asp / \ 1.jsp /'

The \ (... \) pengelompokan mengumpulkan teks yang dapat Anda lihat dengan \ 1 .

Jika Anda ingin membunuh segala sesuatu dari ',' karakter untuk mengakhiri garis, gunakan akhir-of-line marker $ :

$ ... | sed 's /,.*$//' # kill dari koma sampai akhir baris

awk

Bila Anda perlu untuk bekerja dengan kolom data atau mengeksekusi sedikit kode untuk setiap baris pencocokan pola, menggunakan awk . awk program yang pasang pola-tindakan. Sementara beberapa awkprogram yang cukup rumit memerlukan file terpisah yang berisi program, Anda dapat melakukan beberapa hal menakjubkan menggunakan argumen pada baris perintah.

awk berpikir jalur input yang dipecah menjadi bidang (yaitu, kolom) yang terpisah oleh spasi. Bidang direferensikan dalam tindakan melalui $ 1 , $ 2 , ... sementara $ 0 mengacu pada seluruh baris masukan.

Sepasang pola-tindakan seperti:

pattern {action}

Jika Anda menghilangkan pola, aksi dijalankan untuk setiap baris input. Menghilangkan tindakan berarti mencetak garis. Anda dapat memisahkan pasangan dengan baris baru atau koma.

pertimbangkan masukan

aasghar Asghar, Ali 
wchen Chen, Wei 
zchen Chen, Zhen-Jian

Jika Anda ingin daftar nama login, meminta awk untuk mencetak kolom pertama:

$ cat /home/public/cs601/unix/emails.txt | awk '{print $1;}'

Jika Anda ingin mengubah nama login ke alamat email, menggunakan printf fungsi C-lookalike:

$ cat /home/public/cs601/unix/emails.txt | awk '{printf("%s@cs.usfca.edu,",$1);}'

Karena hilang \ n dalam printf string, Anda akan melihat output semua dalam satu baris siap untuk menyisipkan ke program mail:

aasghar@cs.usfca.edu,wchen@cs.usfca.edu,zchen@cs.usfca.edu

Anda mungkin juga ingin menyusun ulang kolom data. Untuk mencetak firstname, lastname, Anda dapat mencoba:

$ cat /home/public/cs601/unix/emails.txt | awk '{printf("%s %s\n", $3, $2);}'

tetapi Anda akan melihat bahwa koma masih ada karena itu adalah bagian dari kolom:

Ali Asghar, 
Wei Chen, 
Zhen-Jian Chen,

Anda perlu pipa output melalui tr (atau sed ) untuk mengupas koma:

$ cat /home/public/cs601/unix/emails.txt | \ 
awk '{printf("%s %s\n", $3, $2);}' | \ 
tr -d ','

Kemudian Anda akan melihat:

Ali Asghar 
Wei Chen 
Zhen-Jian Chen

Anda juga dapat menggunakan awk untuk memeriksa nilai konten. Untuk jumlah kolom pertama dari data berikut (dalam file / home / public / cs601 / unix / kopi ):

3 parrt 
2 jcoker 
8 tombu

menggunakan perintah sederhana berikut:

$ awk '{n+=$1;} ; END {print n;}' < /home/public/cs601/unix/coffee

mana END adalah pola khusus yang berarti "setelah memproses sungai."

Jika Anda ingin menyaring atau jumlah semua nilai yang kurang dari atau sama dengan, mengatakan 3, menggunakan jika pernyataan:

$ awk '{if ($1<=3) n+=$1;} END {print n;}' < /home/public/cs601/unix/coffee

Dalam hal ini, Anda akan melihat output 5 (3 + 2);

Menggunakan awk untuk mengambil kolom tertentu sangat umum saat memproses file log. Pertimbangkan http://www.jguru.com tampilan halaman file log, /home/public/cs601/unix/pageview-20021022.log , yang dalam bentuk:

date-stamp(thread-name): userID-or-IPaddr URL site-section

Jadi, data yang terlihat seperti ini:

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   

Ketika pengguna login, file log memiliki ID pengguna mereka daripada alamat IP mereka.

Berikut adalah bagaimana Anda mendapatkan daftar URL yang orang melihat pada mengatakan 22 Oktober 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
...

Jika Anda ingin menghitung berapa banyak tampilan halaman ada hari itu yang tidak memproses halaman (halaman pengolahan saya semua bentuk process_ xxx ), pipa hasil melalui grep dan wc :

$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log | \
  grep -v process | \
  wc -l
67850

Jika Anda ingin daftar yang unik dari URL, Anda dapat mengurutkan output dan kemudian menggunakan uniq :

$ awk '{print $3;}' < /home/public/cs601/unix/pageview-20021022.log | \
  sort | \
  uniq

uniq hanya runtuh semua lini berulang dalam satu baris - itu sebabnya Anda harus mengurutkan output pertama. Anda akan mendapatkan output seperti:

/article/index.jsp
/article/index.jsp?page=1
/article/index.jsp?page=10
/article/index.jsp?page=2
...

Tarball

Catatan: Nama berasal dari kata yang mirip, hairball (hal-hal yang kucing muntah), aku cukup yakin .

Untuk mengumpulkan sekelompok file dan direktori bersama-sama, menggunakan tar . Misalnya, tar up seluruh direktori home Anda dan menempatkan tarball ke / tmp , melakukan ini

$ cd ~parrt
$ cd .. # go one dir above dir you want to tar
$ tar cvf /tmp/parrt.backup.tar parrt

Dengan konvensi, menggunakan Tar sebagai ekstensi. Untar penggunaan file ini

$ cd /tmp
$ tar xvf parrt.backup.tar

tar untars hal di saat direktori!

Setelah menjalankan untar, Anda akan menemukan sebuah direktori baru, / tmp / parrt , yang merupakan salinan dari direktori home Anda. Perhatikan bahwa cara Anda tar hal-hal menentukan struktur direktori saat mengekstraknya. Fakta bahwa saya sebutkan parrt dalam penciptaan tar berarti bahwa saya akan memiliki dir bahwa ketika mengekstraknya. Sebaliknya, berikut juga akan membuat salinan direktori rumah saya, tapi tanpa memiliki parrt dir root:

$ cd ~parrt
$ tar cvf /tmp/parrt.backup.tar *

Ini adalah ide yang baik untuk tar hal-hal dengan direktori root sehingga ketika Anda untar Anda tidak menghasilkan satu juta file dalam arus langsung. Untuk melihat apa yang ada di tarbal, penggunaan

$ tar tvf /tmp/parrt.backup.tar

Sebagian besar waktu Anda dapat menghemat ruang dengan menggunakan z argumen. Tarball kemudian akan gzip 'd dan Anda harus menggunakan ekstensi file .tar.gz :


$ cd ~parrt
$ cd .. # go one dir above dir you want to tar
$ tar cvfz /tmp/parrt.backup.tar.gz parrt 

Unzip membutuhkan z argumen juga:

$ cd /tmp
$ tar xvfz parrt.backup.tar.gz 

Jika Anda memiliki file besar untuk kompres, menggunakan gzip: 

$ Gzip bigfile

Setelah eksekusi, file Anda akan telah berganti nama bigfile.gz . Untuk uncompress, menggunakan

$ Gzip -d bigfile.gz

Untuk menampilkan file teks yang saat gzip 'd, menggunakan zcat :

$ Zcat bigfile.gz

Memindahkan file antara mesin

rsync

Ketika Anda harus memiliki sebuah direktori pada satu mesin dicerminkan di komputer lain, menggunakan rsync . Itu membandingkan semua file dalam subtree direktori dan salinan atas setiap yang telah berubah ke direktori cermin pada mesin lain. Misalnya, di sini adalah bagaimana Anda bisa "menarik" semua file log dari livebox.jguru.com ke kotak dari mana Anda menjalankan rsync perintah:

$ hostname
jazz.jguru.com
$ rsync -rabz -e ssh -v 'parrt@livebox.jguru.com:/var/log/jguru/*' \
  /backup/web/logs

rsync akan menghapus atau memotong file untuk memastikan file tetap sama. Ini buruk jika Anda menghapus file dengan kesalahan - itu akan menghapus file cadangan Anda. Tambahkan argumen disebut --suffix untuk memberitahu rsync untuk membuat salinan file yang ada sebelum menimpa itu:

$ 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

di mana `date '+% Y% m% d'` (dalam tanda kutip tunggal terbalik) berarti "mengeksekusi ini tanggal perintah".

Untuk mengecualikan pola-pola tertentu dari sinkronisasi, gunakan --exclude :

$ rsync -rabz --exclude=entitymanager/ --suffix .rsync_`date '+%Y%m%d'` \
  -e ssh -v 'parrt@livebox.jguru.com:/var/log/jguru/*' /backup/web/logs

scp

Untuk menyalin file atau direktori secara manual, gunakan scp :

$ scp lecture.html parrt@nexus.cs.usfca.edu:~parrt/lectures

Sama seperti cp , menggunakan r untuk menyalin direktori secara rekursif.

Bermacam-macam

Menemukan

Kebanyakan GUI untuk Linux atau PC memiliki fasilitas pencarian, tetapi dari baris perintah Anda dapat menggunakan menemukan . Untuk menemukan semua file yang bernama .p4 dimulai pada direktori ~ / antlr / depot / proyek , gunakan:

$ find ~/antlr/depot/projects -name '.p4'

Default "tindakan" adalah untuk -print .

Anda dapat menentukan ekspresi reguler untuk mencocokkan. Misalnya, untuk melihat di bawah direktori home Anda untuk setiap file xml, gunakan:

$ find ~ -name '*.xml' -print

Perhatikan penggunaan tanda kutip tunggal untuk mencegah ekspansi baris perintah - Anda ingin '*' untuk pergi ke menemukan perintah.

Anda dapat menjalankan perintah untuk setiap file atau direktori yang ditemukan yang cocok dengan nama. Misalnya, jangan menghapus semua file xml, melakukan hal ini:

$ find ~ -name '*.xml' -exec rm {} \;

mana "{}" singkatan dari "file saat yang cocok". Akhir perintah harus diakhiri dengan ';' tetapi karena ekspansi baris perintah, Anda akan perlu untuk melarikan diri ';'.

Anda juga dapat menentukan informasi waktu dalam permintaan Anda. Berikut ini adalah script shell yang menggunakan menemukan untuk menghapus semua file yang lebih tua dari 14 hari.

#!/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 {} \;

Gunakan menemukan di belakang kutu sebagai argumen:

vi `find . -name '*.java'` # open all java files below current dir

Fuser

Jika Anda ingin tahu siapa yang menggunakan port seperti HTTP (80), menggunakan fuser . Anda harus menjadi root untuk menggunakan ini:

$ 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

output menunjukkan daftar proses yang terkait dengan port tersebut.

Dimana

Kadang-kadang Anda ingin menggunakan perintah tetapi tidak di Anda PATH dan Anda tidak dapat mengingat di mana itu. Gunakan whereis untuk melihat di lokasi unix standar untuk perintah.

$ 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 juga menunjukkan pria halaman.

Yang

Kadang-kadang Anda mungkin menjalankan versi yang salah perintah dan Anda ingin mengetahui versi dari perintah Anda PATH menunjukkan harus dijalankan. Gunakan yang bertanya:

$ which ls
alias ls='ls --color=tty'
/bin/ls
$ which java
/usr/local/java/bin/java

Jika tidak ada yang ditemukan di jalan Anda, Anda akan melihat:

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

Membunuh

Untuk mengirim sinyal ke sebuah proses, menggunakan membunuh . Biasanya Anda akan ingin hanya mengatakan kill pid mana pid dapat ditemukan dari ps atau atas (lihat di bawah).

Gunakan kill -9 pid ketika Anda tidak bisa mendapatkan proses mati; ini berarti membunuhnya dengan "prasangka ekstrem".

Traceroute

Jika Anda mengalami kesulitan mendapatkan ke sebuah situs, menggunakan traceroute untuk menonton urutan hop digunakan untuk mendapatkan ke situs:

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

Apakah alamat IP saya?

$ /sbin/ifconfig

Di bawah eth0 antarmuka, Anda akan melihat addr inet :

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

Kombinasi yang berguna

Cara membunuh serangkaian proses

Jika Anda ingin membunuh semua java proses yang berjalan untuk parrt , Anda dapat menjalankan java killall jika Anda parrt atau menghasilkan "membunuh" script melalui:

$ ps auxwww|grep java|grep parrt|awk '{print "kill -9 ",$2;}' > /tmp/killparrt
$ bash /tmp/killparrt # run resulting script

The / tmp / killparrt berkas akan terlihat seperti:
kill -9 1021
kill -9 1023
kill -9 1024

Catatan: Anda juga dapat melakukan tugas bersama ini dengan:

$ killall java

Perlu diketahui bahwa ini adalah khusus linux; aku diberitahu bahwa itu akan membunuh semua proses pada UNIXen seperti Solaris!

Cara membuat histogram

Sebuah histogram diatur penghitungan, pasangan nilai yang menunjukkan seberapa sering nilai terjadi. Operasi dasar akan memilah, kemudian menghitung berapa banyak nilai-nilai terjadi berturut-turut dan kemudian membalikkan semacam sehingga nilai dengan jumlah tertinggi adalah di bagian atas laporan.

$ ... | sort |uniq -c|sort -r -n

Perhatikan bahwa semacam macam di seluruh baris, tetapi kolom pertama jelas signifikan seperti huruf pertama nama belakang seseorang secara signifikan posisi nama mereka dalam daftar diurutkan.

uniq -c runtuh semua urutan berulang dari nilai-nilai tetapi mencetak jumlah kejadian di depan nilai. Ingat penyortiran sebelumnya:
$ 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
...

Sekarang tambahkan -c untuk 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
...

Sekarang yang perlu anda lakukan adalah semacam sebaliknya garis sesuai dengan kolom pertama numerik.
$ 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
...

Dalam prakteknya, Anda mungkin ingin mendapatkan histogram yang telah "despidered" dan hanya memiliki pemandangan faq terkait. Anda dapat menyaring semua tampilan halaman lini yang terkait dengan IP laba-laba dan filter hanya baris 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
...

Jika Anda ingin hanya melihat halaman faq despidered yang dirujuk lebih dari 500 kali, menambahkan awk perintah untuk akhir.

$ 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

Membangkitkan Java diagram hirarki kelas

Seorang mahasiswa bertanya apakah aku tahu dari program yang dihasilkan diagram hirarki kelas. Saya berkata "tidak", tapi kemudian menyadari bahwa kita tidak perlu satu. Berikut salah satu kapal untuk melakukannya:

# 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 "}"}'

Ini menghasilkan DOT file grafik Format. Cobalah. Sungguh menakjubkan. Bekerja untuk sebagian besar kasus. Output terlihat seperti:

digraph foo {
antlr.CharScanner->JavaLexer
antlr.LLkParser->Mantra
->TestLexer
}

Menghasilkan script dan program

Saya ingin mengotomatisasi sebanyak mungkin. Kadang-kadang itu berarti menulis sebuah program yang menghasilkan program lain atau script.

file surat pengolahan

Saya ingin mendapatkan urutan perintah SQL yang akan memperbarui database kami setiap kali email seseorang melambung. Memproses file email cukup mudah karena Anda dapat mencari kode kesalahan diikuti dengan alamat email. Sebuah email memantul terlihat seperti:

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 ; 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
Message-Id: <200201100132.g0A1W2o02285@web.jguru.com>
To:
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 -----

    (reason: 550 Host unknown)

   ----- Transcript of session follows -----
550 5.1.2 ... Host unknown (Name server: intheneck.com: host not found)
...

Perhatikan pesan kesalahan SMTP 550. Carilah yang pada awal baris kemudian membunuh kurung sudut, menghapus ... dan menggunakan awk untuk mencetak 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

Aku harus melarikan diri dari $ 3 karena itu berarti sesuatu untuk surround shell bash naskah dan saya ingin awk untuk melihat tanda dolar.

Menghasilkan pengambil / setter

#!/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

Apakah saya telah hacked?

login gagal: / var / log / messages

terakhir, w, uptime

/ Etc / passwd berubah?

fuser untuk port

portscans dalam laporan Server

aneh pengolahan memonopoli CPU?