dersblog

Faydalı Unix Komutları

Süreçleri listelemek,

ps -eaf

Listedeki ikinci kolon süreç kimliği (PİD). Onu alıp

kill -9 [PID]

ile sureci yokedebiliriz.

Hangi süreç (process) port 8080'i dinliyor?

netstat -n --tcp -p -l |grep ":8080"

Sadece bastaki satiri gostermek

head -1 [DOSYA]

Bir dosyanin son N satirini atlamak / gostermemek (silme amacli olabillir), mesela son iki satir icin

head -n-2 [DOSYA]

Bir dosyanin ilk satirini atlamak icin

tail -n+2 [DOSYA]

Bir komut çıktısını text olarak başka bir komut içine gömmek

`` kullanilir. Mesela

echo "b.txt" > a.txt
echo "filan" > b.txt
echo "falan" >> b.txt

Yani a.txt içinde b.txt yazıyor, şimdi

wc -l `cat a.txt`

dersek, a.txt icindeki b.txt arguman olarak wc'ye verilecek. Ve

2 b.txt

sonucu gelecek. Yani burada a.txt degil onun icindeki b.txt wc'ye gecildi.

Eğer bir Ünix script'inizin .başhrç içinde tanımladığınız alias (kısayolları) kullanmasını istiyorsanız, bu script'i şöyle işletmeniz gerekir:

bash -i [script]

Emacs icin benzer durum, M-x compile alias'lari gormuyor. Onun icin

(setq shell-file-name "bash")
(setq shell-command-switch "-ic")

tanımlamak lazım.

Sonsuz kere bir komutu işletmek için, mesela süreç listesini sürekli göstermek

while true; do ps -eaf; sleep 2; done

Belli satırlar arasındaki satırları çekip çıkartmak, mesela 10 ile 20

sed -n 10,20p [DOSYA]

Rasgele satırlar çekip çıkarmak (.005 bir oran, daha fazla satır için bu sayı arttırılabilir)

cat [DOSYA] | perl -n -e 'print if (rand() < .005)'

Dosya içinde metin aramak (/usr seviyesinden aşağı doğru inerek, tüm altdızinlerde, xml soneki taşıyan dosyalarda)

find /usr -name '*.xml' -exec grep -l 'filan' {} \;

Dosya içinde kelime değiştirmek (xml sonekli dosyalarda, altdizinlere girmez)

perl -pi -e 's/filan/falan/sg' *.xml

Üsttekinden daha iyisi replace.py diye ufak bir Python script yazmak,

import os, re, sys
filename = sys.argv[1]
content = open(filename).read()
fout = open(filename,"w")

content = content.replace("burak","bayramli")
fout.write(content)
fout.close()

Üstteki script'i python replace.py [dosya] şeklinde çağırabiliriz. Bu tek dosya üzerinde değişim yapar. Eldeki content üzerinde her türlü regex, vs. bazlı işlemleri yapabiliriz. Hatta gerekirse başa, sona istediğimiz metni ekleyebiliriz.

Eğer birçok dosya üzerinde üstteki değişimi yapmak istersek,

find .-type f -name "*" -exec python replace.py {} \;

Bu tür kullanımda {} \; ile alınan dosyalar teker teker Python'a geçiliyor, dosya ismi sys.argv[1] içinde olmak üzere.

Üstteki türden kullanımı daha akıllıca bir grep için de kullanabilirdik. Mesela her dosya içinde çetrefil bir regex üzerinden bir arama yapmak istersek bu yapılabilir. Bir kere içinde şu tür ifadeler içeren dosyaları aramak gerekmişti, "bir satırda tek başına iki dolar işareti, ardındaki satırda tek başına eşittir işareti olan tüm dosyalar". Unix'te find ile alttaki koda çağrı yaptım,

res = re.findall('^\$\$\s*\n=\s*\n',open(sys.argv[1]).read(), re.MULTILINE)
if len(res)>0:
    print (sys.argv[1], res)

Dosyayı kullanan program hangisi

lsof [DOSYA]

Bir dizinden başlayarak özyineli (recursive) olarak o dizin altındaki en büyük dosyaları listelemek için

du -h | sort -hr | head -20

Bir makinadaki tüm donanımları listele (Ubuntu)

lspci

Harici sabit diskte bazı dizinlerimin yedeğini tutuyoruz, ve iki yerel dizini senkronize etmek için

rsync --delete -r /tmp/dira/ /tmp/dirb

Üstteki rsynç komutu kaynak dizini "belirleyici (master)" olarak kabul edecektir, ve /tmp/dira içinde olan her şey, yeni dosya, mevcutun silinmesi, ekleme işlemi aynen /tmp/dirb'ye yansıtılacaktır. Not: Eğer /tmp/dirb FAT32, NTFS gibi Windows temelli bir dosya sistemi ise azar azar güncelleme ise yaramaz, tüm dosyalar her seferinde tekrar silbaştan yollanır. Bunun sebebi Win temelli dosya sistemlerinin dosya sahibi, erişim hakları gibi bilgileri -Unix ile uyumlu- tutmuyor olmasıdır.

Bir dosya içinde mesela her "dropbox" kelimesinden önce gelen 700 karakteri göster

grep -E -o ".{700}dropbox" dosya.txt

Programın sonuçlarını hem ekrana basmak aynı anda bir log dosyasına yazmak

sh script.sh  2>&1 | tee out.log

Buyuk Dosyalar

sudo du -hx --max-depth=1 .

Dizin bazında kullanım raporu verir.

Eğer dosya büyüklüğüne göre sıralı liste istersek (içinde olduğumuz dizinde)

sudo du -hb --max-depth=2 . | sort -n

Yukarı