Grep veya ack tarafından döndürülen uzun eşleşen satırlar nasıl kesilir


91

Ack veya grep'i genellikle çok uzun satırları olan HTML dosyalarında çalıştırmak istiyorum. Tekrar tekrar saran çok uzun çizgiler görmek istemiyorum. Ama uzun bir çizginin, normal ifadeyle eşleşen bir dizeyi çevreleyen kısmını görmek istiyorum. Bunu Unix araçlarının herhangi bir kombinasyonunu kullanarak nasıl elde edebilirim?


1
Nedir ack? Bir şeyi beğenmediğin zaman kullandığın bir komut mu? Gibi bir şey ack file_with_long_lines | grep pattern? :-)
Alok Singhal

6
@Alok ack( ack-grepDebian'da olarak bilinir ) grepsteroid kullanıyor. Ayrıca --thppptseçeneği de var (şaka değil). betterthangrep.com
ZoogieZork

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

1
İken --thppptözellik biraz tartışmalıdır, temel avantajı Perl kullanabileceği gibi görünen, doğrudan bazı deli değil Regexes [[:space:]]ve karakterler gibi {, [birlikte anlam değişiyor vs. -eve -Ehatırlamak imkansız bir şekilde geçer.
Evgeni Sergeev

Yanıtlar:


101

Grep seçeneğini -o, ".{0,10}<original pattern>.{0,10}"etrafındaki bağlamı görmek için muhtemelen deseninizi olarak değiştirerek kullanabilirsiniz :

       -o, --only-eşleşme
              Eşleşen bir satırın yalnızca PATTERN ile eşleşen kısmını göster.

..veya -c:

       -c, --count
              Normal çıktıyı bastırır; bunun yerine eşleşen satır sayısı yazdır
              her girdi dosyası için. -V, --invert-match seçeneği ile (bkz.
              aşağıda), eşleşmeyen satırları sayın.

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

14
@Renaud (genişletilmiş kalıp seçeneği) tarafından gösterildiği gibi -E eklemek için yanıtı veya bağlamı genişletmek için önerilen modeli değiştirmelisiniz.
kriss

O kadar gerekli değil belki ama işte bir örnek: $ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt baskılarqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
Ulises Layera

1
Bu iyi çalışıyor; ancak kayda değer dezavantajı, örneğin kullanırken, oE ".{0,20}mysearchstring.{0,20}"içeriğe karşı iç "orijinal" dizginin vurgulanmasını kaybedersiniz, çünkü her şey arama modeli haline gelir. Daha kolay görsel tarama ve sonuç yorumlama için arama sonuçlarının çevresinde vurgulanmamış bağlamı korumanın bir yolunu bulmak isterim.
Aaron Wallentine

1
Oh, -oE ".{0,x}foo.{0,x}"yaklaşımı kullanmanın neden olduğu vurgulama sorununa bir çözüm (burada xbağlamdaki karakter sayısı) - ek '| grep foo `` sonuna kadar. Ack veya grep çözümleri için çalışır. Burada daha fazla çözüm de var: unix.stackexchange.com/questions/163726/…
Aaron Wallentine

45

Sonuçlarınızı iletin cut. Ayrıca bir --cutanahtar eklemeyi düşünüyorum, böylece söyleyip --cut=80yalnızca 80 sütun elde edebilirsiniz.


8
Ya eşleşen kısım ilk 80 karakterde değilse?
Ether

3
FWIW Grep'e ekledim | cut=c1-120, benim için çalıştım (ancak eşleşen metni nasıl keseceğimi bilmiyorum)
Jake Rayson

26
| cut=c1-120benim için çalışmadı, yapmam gerekiyordu| cut -c1-120
Ken Cochrane

1
@Edib'in sözdiziminde doğru olduğunu düşünüyorum | cut -c 1-100 stackoverflow.com/a/48954102/1815624
CrandellWS

1
@AndyLester: Kullanan bir --no-wrapseçenek ne olacak $COLUMNS?
naught101

25

Daha azını çağrı cihazı olarak uzun satırları kesmek ve kesmek için kullanabilirsiniz: ack --pager="less -S" Bu, uzun çizgiyi korur, ancak onu kaydırmak yerine tek satırda bırakır. Satırın daha fazlasını görmek için, ok tuşlarıyla sola / sağa daha az kaydırın.

Bunu yapmak için, ack için aşağıdaki takma ad kurulumuna sahibim:

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

2
--pagerHer zaman kullanmak istiyorsanız, bu komutu ~ / .ackrc dosyanıza koyabileceğinizi lütfen unutmayın .
Andy Lester

Bu, beni çok rahatsız eden bu soruna en iyi çözüm gibi geliyor. Keşke nasıl kullanılacağını bilseydim ack.
Brian Peterson

@BrianPeterson ackhemen hemen aynı grep, sadece en yaygın durumlarda daha basit
Aaron Wallentine

8
cut -c 1-100

1'den 100'e kadar karakter alır.


2

: 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}", vurgulama renginin genellikle karışık olması dışında mükemmel bir şekilde iyidir. Benzer bir çıktıya sahip bir komut dosyası oluşturdum, ancak renk de korunuyor:

#!/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))}"

Komut olarak kaydedilir varsayarsak grepl, ardından grepl pattern file_with_long_lineseşleşen satırları görüntülemek fakat eşleştirme dize etrafında sadece 10 karakterli olmalıdır.


Çalışır, ancak benim için takip eden önemsiz çıktılar şu şekilde: ^ [[? 62; 9; c. @ Jonah Braun'un cevabı beni tatmin ettiği için hata ayıklamayı denemedim .
sondra.kinsey

2

görüntü açıklamasını buraya girin

Kullanamayacağınız alışılmadık bir durumda -Eşunları kullanabilirsiniz:

grep -oe ".\{0,10\}error.\{0,10\}" mylogfile.txt

1

İşte yaptığım şey:

function grep () {
  tput rmam;
  command grep "$@";
  tput smam;
}

.Bash_profile dosyamda grep'i geçersiz kılıyorum, böylece otomatik olarak tput rmamönce ve tput smamsonra çalışır , bu da sarmalamayı devre dışı bırakır ve ardından yeniden etkinleştirir.


Bu güzel bir alternatif - ancak gerçek maçın ekran dışında olması dışında ...
Xerus

0

Aşağıdakileri benim .bashrc:

grepl() {
    $(which grep) --color=always $@ | less -RS
}

Daha sonra greplkomut satırında mevcut olan herhangi bir argümanla kullanabilirsiniz grep. Daha uzun çizgilerin kuyruğunu görmek için ok tuşlarını kullanın. qÇıkmak için kullanın .

Açıklama:

  • grepl() {: Her (yeni) bash konsolunda mevcut olacak yeni bir işlev tanımlayın.
  • $(which grep): Tam yolunu alın grep. (Ubuntu grepbunun için eşdeğer olan bir takma ad tanımlar grep --color=auto. Bu takma adı değil, orijinali istiyoruz grep.)
  • --color=always: Çıkışı renklendirin. (Diğer --color=autoad grep, çıktının bir boruya konulduğunu algıladığından ve o zaman onu renklendirmediğinden çalışmaz.)
  • $@: İşleve verilen tüm argümanları greplburaya koyun .
  • less: Satırları kullanarak less
  • -R: Renkleri göster
  • S: Uzun satırları kırmayın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.