Yalnızca eklenmiş ve silinmiş satırları göstermek için nasıl farklılaşabilirim? Eğer diff bunu yapamazsa, hangi araç olabilir?
diff A B | grep '^[<>]'
comm
.
Yalnızca eklenmiş ve silinmiş satırları göstermek için nasıl farklılaşabilirim? Eğer diff bunu yapamazsa, hangi araç olabilir?
diff A B | grep '^[<>]'
comm
.
Yanıtlar:
Bakmanın başka bir yolu:
Yalnızca a dosyasındaki satırları göster: (yani a'dan silinen şey)
comm -23 a b
Yalnızca b dosyasında bulunan satırları göster: (yani, b'ye ne eklenmiş)
comm -13 a b
Yalnızca bir dosyada veya diğerinde bulunan satırları göster: (ancak her ikisini de değil)
comm -3 a b | sed 's/^\t//'
(Uyarı: Dosyada a
SEKME ile başlayan çizgiler varsa , (ilk SEKME) çıkıştan kaldırılır.)
NOT:comm
Düzgün çalışması için iki dosyanın da sıralanması gerekir. Zaten sıralanmamışlarsa, sıralamanız gerekir:
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
Dosyalar çok uzunsa, bu, fazladan bir kopya gerektirdiğinden ve bu nedenle iki kat daha fazla disk alanı gerektirdiğinden oldukça yük olabilir.
comm -12 <(sort a) <(sort b)
comm
ne istersen yapabilirsin. Man sayfasından:
AÇIKLAMA
Sıralanan dosyaları FILE1 ve FILE2 satır satır karşılaştırın.
Hiçbir seçenek olmadan, üç sütun çıktısı üretin. Bir sütun, FILE1'e özgü satırlar içerir, ikinci sütun FILE2'ye özgü satırlar içerir ve sütun üçü her iki dosyada da ortak olan satırları içerir.
Bu sütunlar ile suppressable olan -1
, -2
ve -3
sırasıyla.
Örnek:
[root@dev ~]# cat a
common
shared
unique
[root@dev ~]# cat b
common
individual
shared
[root@dev ~]# comm -3 a b
individual
unique
Ve sadece benzersiz satırları istiyorsanız ve hangi dosyada olduklarını umursamıyorsanız:
[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique
Man sayfasının dediği gibi, dosyalar önceden sıralanmalıdır.
Bağlamsız eklemeleri ve silmeleri göstermek için, satır numaraları, +, -, <,>! Vb, bu gibi diff kullanabilirsiniz:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
Örneğin, iki dosya verilir:
a.txt
Common
Common
A-ONLY
Common
b.txt
Common
B-ONLY
Common
Common
Aşağıdaki komut, a'dan kaldırılmış veya b'ye eklenen satırları gösterecektir:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
çıktı:
B-ONLY
A-ONLY
Bu biraz farklı komut a.txt dosyasından kaldırılan satırları gösterecektir:
diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt
çıktı:
A-ONLY
Son olarak, bu komut a.txt dosyasına eklenen satırları gösterecektir.
diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt
çıktı
B-ONLY
Varsayılan olarak ne fark budur ... Belki beyaz boşlukları yoksaymak için bazı bayraklar eklemeniz gerekir?
diff -b -B
boş satırları ve farklı sayıdaki boşlukları dikkate almamalı.
Hayır, diff
aslında iki dosya arasındaki farkları birinin düşündüğü gibi göstermiyor. patch
Bir dosyayı bir başkasına dönüştürmek için kullanmak gibi bir araç için düzenleme komutları dizisi oluşturur .
Aradığınızı yapma girişiminin zorluğu, neyin silinmiş bir hatla değiştirildiğini ve ardından eklenmiş bir hat oluşturulduğunu tanımlamaktır. Ayrıca, satırlar birbirine eklendiğinde, eklendiğinde, silindiğinde ve değiştirildiğinde ne yapılmalı.
diff
Kaynaklara baktığımdan bu yana çok zaman geçti , ama iki dosyanın senkronize kalacağı yerleri eşleştirmek için her türlü girintiyi hatırlıyor gibiyim. çizgiler Ancak (isteğe bağlı olarak) daraltılmış beyaz boşluk veya görmezden gelinme durumu dışında herhangi bir satır içi eşleşmeyi hatırlamıyorum. Ya da (belki) bu kelimelere etki eder. Her durumda, hepsi hakkında patch
ve "vgrep" sadece yolculuk için geliyor. Olabilir. Salı günü.
Görsel karşılaştırma araçları iki dosyaya da uyuyor, böylece aynı sayıda satıra sahip ancak farklı içeriğe sahip bir segment değiştirilmiş bir segment olarak kabul edilecek. Eşleşen segmentler arasındaki tamamen yeni çizgiler, eklenmiş segmentler olarak kabul edilir.
Aynı zamanda sdiff komut satırı aracının çalışması, terminaldeki iki dosyanın yan yana karşılaştırılmasını gösterir. Değişen çizgiler | karakter. Eğer sadece A dosyasında bir çizgi varsa, ayırıcı karakter olarak <kullanılır. Sadece B dosyasında bir çizgi varsa, ayırıcı olarak> kullanılır. Dosyalarda <ve> karakteriniz yoksa, bunu yalnızca eklenen satırları göstermek için kullanabilirsiniz:
sdiff A B | grep '[<>]'
Teşekkürler senarvi, çözümünüz (oy kullanmadı) aslında bana tonlarca sayfadaki yaş aradıktan sonra ne istediğimi verdi.
Cevabınızı kullanarak, değiştirilen / eklenen / silinen şeylerin listesini almak için geldiğim şey budur. Örnek / etc / passwd dosyasının 2 versiyonunu kullanır ve ilgili kayıtların kullanıcı adını yazdırır.
#!/bin/bash
sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'
Bu özel formu genellikle yararlı buluyorum:
diff --changed-group-format='-%<+%>' --unchanged-group-format='' f g
Örnek:
printf 'a\nb\nc\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
Çıktı:
-b
-c
+B
+C
-e
-f
+E
+F
Böylece -
hemen ardından gelen yeni satırlarla birlikte gelen eski satırları gösterir +
.
Silme işlemi yapsaydık C
:
printf 'a\nb\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
şuna benziyor:
-b
+B
+C
-e
-f
+E
+F
Format şu şekilde belgelenmiştir man diff
:
--line-format=LFMT
format all input lines with LFMT`
ve:
LTYPE is 'old', 'new', or 'unchanged'.
GTYPE is LTYPE or 'changed'.
ve:
LFMT (only) may contain:
%L contents of line
%l contents of line, excluding any trailing newline
[...]
İlgili soru: https://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux
Ubuntu 18.04'te test edilmiştir.
file1:
text670_1
text067_1
text067_2
file2:
text04_1
text04_2
text05_1
text05_2
text067_1
text067_2
text1000_1
kullanın:
diff -y file1 file2
Bu, düzeltici dosyalar için iki sütun gösterir.
Çıktı:
text670_1
> text04_1
> text04_2
> text05_1
> text05_2
text067_1 text67_1
text067_2 text67_2
> text1000_1