2010-01-09 20 views
57

Sık sık çok uzun çizgilere sahip HTML dosyalarında ack veya grep çalıştırmak istiyorum. Sürekli tekrarlanan çok uzun çizgiler görmek istemiyorum. Ancak, normal ifadeyle eşleşen bir dizeyi çevreleyen uzun bir çizginin sadece bir kısmını görmek istiyorum. Unix araçlarının herhangi bir kombinasyonunu kullanarak bunu nasıl sağlayabilirim?Grep veya ack tarafından döndürülen uzun eşleşen çizgiler nasıl kırpılır

 
     -o, --only-matching 
       Show only the part of a matching line that matches PATTERN. 

..ya -c:

 
     -c, --count 
       Suppress normal output; instead print a count of matching lines 
       for each input file. With the -v, --invert-match option (see 
       below), count non-matching lines. 
+1

1'den karakterleri alacak? Bir şey sevmediğinde kullandığınız bir komut mu? Bir şey gibi ack file_with_long_lines | grep desen '? :-) –

+6

@Alok 'ack' (Debian'da" ack-grep "olarak bilinir), steroidlerde grep'dir. Ayrıca '--pppp' seçeneğine de sahip (şaka değil). http://betterthangrep.com/ – ZoogieZork

+0

Teşekkürler. Bugün bir şey öğrendim. –

cevap

57

Bunun bir takım içerikler görmek için ".{0,10}<original pattern>.{0,10}" için deseni değişen kombinasyon içinde grep seçeneğini -o kullanabilirsiniz Sonuçlarınız cut ile. Ayrıca --cut anahtarını eklemeyi düşünüyorum - böylece =cut = 80 ve sadece 80 sütun elde edersiniz.

+21

bir örnek: grep -oE ". {0,20} mysearchstring. {0,20}" myfile – Renaud

+9

cevabını @Renaud (genişletilmiş desen seçeneği) ile gösterildiği gibi -E seçeneği eklemek için veya önerilen desen için bağlamı genişletmek işe yaramaz. – kriss

28

Pipe

+5

Eşleşen parça ilk 80 karakterde değilse ne olur? – Ether

+3

FWIW Eklendi '| grep için cut = c1-120', benim için çalıştı (ancak eşlenmiş metnin nasıl kesileceğini bilmiyorum) –

+17

'' | cut = c1-120'' benim için çalışmadı, yapmam gerekiyor '' | cut -c1-120'' –

17

Ack için daha kısa bir çağrı cihazı kullanabilir ve uzun satırları kesebilirsiniz: ack --pager="less -S" Bu uzun satırı korur, ancak sarma yerine bir satıra bırakır. Hattın daha fazlasını görmek için, ok tuşlarıyla daha az sola/sağa kaydırın.

alias ick='ack -i --pager="less -R -S"' 
+0

Lütfen her zaman kullanmak istiyorsanız, '/pack' komutunu ~/.ackrc dosyanıza koyabilirsiniz. –

+0

Bu sorun bana çok fazla hata veren en iyi çözüm gibi geliyor. Keşke 'ack' kullanmayı bilmemi isterdim. –

1

Alındığı: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/

önerilen yaklaşım ".{0,10}<original pattern>.{0,10}" vurgulayarak renk genellikle berbat olduğunu haricinde gayet iyi olduğunu

Bunu yapmak ack için aşağıdaki takma kurulum var. Ben de benzer bir çıkış ile bir senaryo oluşturduk ama renk de korunur:

#!/bin/bash 

# Usage: 
# grepl PATTERN [FILE] 

# how many characters around the searching keyword should be shown? 
context_length=10 

# What is the length of the control character for the color before and after the 
# matching string? 
# This is mostly determined by the environmental variable GREP_COLORS. 
control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1)) 
control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1)) 

grep -E --color=always "$1" $2 | 
grep --color=none -oE \ 
    ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}" 

senaryo grepl, sonra grepl pattern file_with_long_lines eşleşen satırları görüntülemek fakat eşleştirme dize etrafında sadece 10 karakterli olmalıdır kaydedilir varsayarsak.

0
cut -c 1-100 

100 `ack` nedir

İlgili konular