[Çözüldü] komut içinde komut

Başlatan ludwig9292, 04 Ocak 2011 - 16:28:48

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

ludwig9292

merhaba;
unix işletim sistemleri adlı bir ders alıyorum şuan, kabuk programlama bölümünde bir ödev verdi hocam.
iki dosyanın n satırını karşılaştırıp farklı yada aynı yazdırmamız lazım.

diff komutu içinde head kullanmak istedim ama nasıl yapacağımı bulamadım.

yolunu söyleyebilirmisiniz yada önereceğiniz başka * bir şey var mı?

şimdiden teşekkürler.

sem

Boru haberleşmesi ile bir komutun çıktısını bir başka komuta girdi olarak verebilirsniz. Bunun için borular (pipe) kullanılıyor. Bash kodlamaya çok aşina değilim... O nedenle doğrudan kod yazarak yardımcı olamayacağım fakat bash'te boruları "|"  atomu ile açlıyoruz. Bu şekilde bir boru ile bir komutun çıktısını diğer bir komuta girdi olarak verebiliyorsunuz.

ls -li

komutu ile bir dizin içeğini listeniyoruz.

ls -li | grep AA

grep AA komutu normalde AA içeriği geçen çıktıları ayıklamak için kullanılıyor. Bu şekilde kullanım ile yani iki komut arasına | koyarak birisinn çıktısını diğerine girdi olarak vermiş oluyorsunuz. Yani komut otomatik olarak listelenen dizin içerisindeki "AA" ibaresi geçen çıktıları döndürmüş oluyor...

Yani araştırmanız gereken şey | atomu sanıyorum...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ludwig9292

teşekkür ederim araştıracağım umarım becerebilirim.

jayw

Sorduğunuz soruya örnek olabilir diye düşünüyorum. Basit olarak sistemde bulunan kök dizin (/) ile usr dizinlerini karşılaştırıp, bu karşılaştırmanın ilk 10 satırını listeliyoruz.

sudo diff / /usr/ | head -n 10
Common subdirectories: /bin and /usr//bin
Only in /: boot
Only in /: cdrom
Only in /: dev
Only in /: etc
Only in /usr/: games
Only in /: home
Only in /usr/: include
Only in /: initrd.img
Common subdirectories: /lib and /usr//lib


-rq parametresi kullanılarak:

sudo diff -rq / /usr/ | head -n 10
Only in /usr//bin: [
Only in /usr//bin: 2to3
Only in /usr//bin: 2to3-2.6
Only in /usr//bin: 411toppm
Only in /usr//bin: 7z
Only in /usr//bin: 7za
Only in /usr//bin: 7zr
Only in /usr//bin: a2p
Only in /usr//bin: aaflip
Only in /usr//bin: abrowser


Diff ile dizin karşılaştırma hakkında bir yazıya aşağıdaki adresten ulaşabilirsiniz.

http://www.syslogs.org/diff-ile-dizin-karsilastirma-ve-fark-tespiti/

Yukarıdaki siteden -rq parametreleri konusunda bir alıntı:
Alıntı Yap-r (recursive): Belirtilen dizinin tüm alt dizinlerine de göz atılmasını sağlamaktadır.
-q (brief): ise, farkların özet olarak gösterilmesini sağlar. Böylece düzgün bir listeleme yapılabilir.

ludwig9292

aslında başka türlü bişey yaptım biraz uzadı sanırım ama kullanıcıdan satır sayısı istedim
dosya1 deki n satırı b1 dosyasına
dosya2 deki n satırıda b2 dosyasına kopyaladım

b1 ile b2 nin içeriği aynıysa "aynı" farklı ise "farklı" yazsın istiyorum.

if else ile diff kullanacağım b1 ile b2 yi karşılaştırınca farklılık bulursa farkı bulmazsa nasıl ayni yazdırabilirim ekrana?


heartsmagic

Dolambaçlı yol kalsın diyorsan:

#!/bin/sh

if diff dosya1 dosya2 >/dev/null ; then
      echo Aynı
else
     echo Farklı
fi


http://www.linuxquestions.org/questions/linux-newbie-8/bash-script-to-compare-two-files-563836/
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

ironic

Diff e alternatif olarak md5sum ile md5 sağlaması da yapılarak bulunabilir.


#!/bin/bash

N=İstenen_satir_sayisi
dosya1=$(head -n $N dosya_bir | md5sum)
dosya2=$(head -n $N dosya_iki | md5sum)

if [ "$dosya1" = "$dosya2" ]
then
        echo "Karşılaştırılan içerikler aynı"
else
         echo "Karşılaştırılan içerikler farklı"
fi


ludwig9292

cevaplarınız için teşekkür ederim.
araştırma yapmamda çok yardımcı oldu.
belki başkasınada ben yardımcı olurum diyerek programı paylaşıyorum.


#!/bin/bash
echo " lutfen giriş yapınız sıra ile satır sayısı 1.dosya ismi 2.dosya ismi"
read Satir Dosya1 Dosya2
if [ `cat $Dosya1 | wc -l` -lt $Satir ]
then
echo "farkli"
else
if [ `cat $Dosya2 | wc -l` -lt $Satir ]
then
echo "farkli"
else
head -$Satir $Dosya1 > Temp_S1.txt
head -$Satir $Dosya2 > Temp_S2.txt
diff Temp_S1.txt Temp_S2.txt > Temp_S3.txt
if [ `cat Temp_S3.txt | wc -l` -eq 0 ]
then
echo "ayni"
else
echo "farkli"
fi
#dosyalar kapatılıyor
rm Temp_S1.txt
rm Temp_S2.txt
rm Temp_S3.txt
fi
fi




Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 13 Ocak 2011 - 01:32:47

birde ders hocasının en kısa halde çözümü var o da aşağıda.


#!/bin/bash
[ `wc -l < $2` -gt $1 ] && [ `wc -l < $3` -gt  $1 ] && [ "`head -$1 $2`" == "`head -$1 $3`" ] && echo 'ayni' || echo 'farkli'