Używając tego:
grep -A1 -B1 "test_pattern" file
wyświetli jedną linię przed i po dopasowanym wzorcu w pliku. Czy istnieje sposób, aby wyświetlić nie wiersze, ale określoną liczbę znaków?
Linie w moim pliku są dość duże, więc nie interesuje mnie drukowanie całej linii, a raczej obserwowanie dopasowania w kontekście. Jakieś sugestie, jak to zrobić?
Odpowiedzi:
3 znaki przed i 4 znaki po
źródło
brew install homebrew/dupes/grep
i uruchom jakoggrep
.Dopasuje do 5 znaków przed i po wzorze. Przełącznik -o mówi grepowi, aby wyświetlał tylko dopasowanie, a -E, aby używał rozszerzonego wyrażenia regularnego. Upewnij się, że wyrażenie zostało otoczone cudzysłowami, w przeciwnym razie powłoka może je zinterpretować.
źródło
{0,255}
dzieł{0,256}
dajegrep: invalid repetition count(s)
Możesz użyć
źródło
Masz na myśli tak:
?
Spowoduje to wydrukowanie do dwudziestu znaków po obu stronach
test_pattern
.\{0,20\}
Notacja jest podobny*
, ale określa zera do dwudziestu powtórzeń zamiast zero lub more.The-o
mówi pokazać tylko sam mecz, a nie całej linii.źródło
grep: Invalid content of \{\}
Za pomocą
gawk
możesz użyć funkcji dopasowania:Jeśli nie masz nic
perl
przeciwko, bardziej elastycznemu rozwiązaniu: Następujące spowoduje wydrukowanie trzech znaków przed wzorem, a następnie faktycznego wzoru i 5 znaków po wzorze.Można to również zastosować do słów zamiast samych znaków, a następnie wypisze jedno słowo przed właściwym pasującym ciągiem.
Następujące spowoduje wydrukowanie jednego słowa po wzorze:
Następujące spowoduje wydrukowanie jednego słowa przed wzorcem, następnie właściwego słowa, a następnie jednego słowa po wzorcu:
źródło
Możesz użyć wyrażenia regularnego grep do znalezienia + drugiego grep do wyróżnienia
23_string_and
źródło
Nigdy nie zapamiętam tych tajemniczych modyfikatorów poleceń, więc wybrałem najlepszą odpowiedź i przekształciłem ją w funkcję w moim
~/.bashrc
pliku:Oto jak to wygląda w akcji:
Plik, o którym mowa, to jedna ciągła linia 25K i beznadziejne jest znalezienie tego, czego szukasz, używając zwykłego
grep
.Zwróć uwagę na dwa różne sposoby wywołania
cgrep
tejgrep
metody paraleli .Istnieje „ładniejszy” sposób tworzenia funkcji, w której „$ 2” jest przekazywane tylko wtedy, gdy jest ustawiona, co oszczędziłoby 4 wiersze kodu. Nie mam go jednak pod ręką. Coś jak
${parm2} $parm2
. Jeśli ją znajdę, zrewiduję funkcję i tę odpowiedź.źródło