Chcę uruchomić ACK lub Grep na plikach HTML, które często mają bardzo długie wiersze. Nie chcę widzieć wielokrotnie zawijanych bardzo długich linii. Ale chcę zobaczyć tylko tę część długiej linii, która otacza ciąg pasujący do wyrażenia regularnego. Jak mogę to uzyskać używając dowolnej kombinacji narzędzi Unix?
90
ack
? Czy jest to polecenie, którego używasz, gdy coś ci się nie podoba? Coś jakack file_with_long_lines | grep pattern
? :-)ack
(znany jakoack-grep
Debian) jestgrep
na sterydach. Ma również--thpppt
opcję (nie żartuję). betterthangrep.com--thpppt
funkcja jest nieco kontrowersyjny, kluczem zaletą wydaje się, że można użyć Perl regexes bezpośrednio, a nie jakiś szalony[[:space:]]
i znaków podoba{
,[
itp zmieniając sens z-e
i-E
przełącza się w taki sposób, że niemożliwe do zapamiętania.Odpowiedzi:
Możesz użyć opcji grep
-o
, prawdopodobnie w połączeniu ze zmianą wzorca na".{0,10}<original pattern>.{0,10}"
, aby zobaczyć otaczający go kontekst:.. lub
-c
:źródło
$ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt
wydrukiqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
oE ".{0,20}mysearchstring.{0,20}"
tracisz podświetlenie wewnętrznego „oryginalnego” ciągu w kontekście kontekstu, ponieważ całość staje się wzorcem wyszukiwania. Chciałbym znaleźć sposób na zachowanie nieokreślonego kontekstu wokół wyników wyszukiwania, aby znacznie ułatwić wizualne skanowanie i interpretację wyników.-oE ".{0,x}foo.{0,x}"
podejścia (gdziex
jest liczba znaków kontekstu) - dodaj `| grep foo `do końca. Działa dla rozwiązań ACK lub GREP. Więcej rozwiązań również tutaj: unix.stackexchange.com/questions/163726/…Przepuść swoje wyniki
cut
. Rozważam również dodanie--cut
przełącznika, abyś mógł powiedzieć--cut=80
i uzyskać tylko 80 kolumn.źródło
| cut=c1-120
do grepa , działało dla mnie (chociaż nie wiem, jak wyciąć dopasowany tekst)| cut=c1-120
nie działało dla mnie, musiałem to zrobić| cut -c1-120
| cut -c 1-100
stackoverflow.com/a/48954102/1815624--no-wrap
opcją, która używa$COLUMNS
?Możesz użyć mniej jako pagera do potwierdzania i przycinania długich linii:
ack --pager="less -S"
To zachowuje długą linię, ale pozostawia ją w jednej linii zamiast zawijania. Aby zobaczyć więcej linii, przewijaj w lewo / w prawo mniej za pomocą klawiszy strzałek.Mam następujący alias dla potwierdzenia, aby to zrobić:
źródło
--pager
polecenie w swoim pliku ~ / .ackrc, jeśli zawsze chcesz go używać.ack
.ack
jest prawie taki samgrep
, tylko prostszy w najczęstszych przypadkachpobiera znaki od 1 do 100.
źródło
Zaczerpnięte z: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/
Sugerowane podejście
".{0,10}<original pattern>.{0,10}"
jest całkiem dobre, poza tym, że kolor podświetlenia jest często pomieszany. Stworzyłem skrypt z podobnym wynikiem, ale kolor też jest zachowany:#!/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))}"
Zakładając, że skrypt jest zapisany jako
grepl
,grepl pattern file_with_long_lines
powinien wyświetlić pasujące wiersze, ale tylko z 10 znakami wokół pasującego ciągu.źródło
Oto co robię:
W moim .bash_profile nadpisuję grep, tak aby był automatycznie uruchamiany
tput rmam
przed itput smam
po, co wyłączyło zawijanie, a następnie ponownie go włączyło.źródło
W nietypowej sytuacji, w której nie możesz użyć
-E
, możesz użyć:źródło
Do mojego
.bashrc
:Możesz następnie użyć
grepl
w wierszu poleceń z dowolnymi argumentami, które są dostępne dlagrep
. Użyj klawiszy strzałek, aby zobaczyć koniec dłuższych linii. Użyj,q
aby zakończyć.Wyjaśnienie:
grepl() {
: Zdefiniuj nową funkcję, która będzie dostępna w każdej (nowej) konsoli bash.$(which grep)
: Uzyskaj pełną ścieżkęgrep
. (Ubuntu definiuje alias dlagrep
tego jest równoważny zgrep --color=auto
. Nie chcemy tego aliasu, ale oryginałgrep
).--color=always
: Kolorowanie wydruku. (--color=auto
z aliasu nie zadziała, ponieważgrep
wykrywa, że wyjście jest umieszczone w potoku i nie będzie go wtedy kolorować).$@
: Umieść tutaj wszystkie argumenty przekazanegrepl
funkcji.less
: Wyświetl linie za pomocąless
-R
: Pokaż koloryS
: Nie przerywaj długich liniiźródło