Ich möchte ack oder grep für HTML-Dateien ausführen, die oft sehr lange Zeilen haben. Ich möchte keine sehr langen Zeilen sehen, die wiederholt umbrochen werden. Aber ich möchte nur den Teil einer langen Zeile sehen, der eine Zeichenfolge umgibt, die dem regulären Ausdruck entspricht. Wie kann ich dies mit einer beliebigen Kombination von Unix-Tools erreichen?
88
ack
? Ist es ein Befehl, den Sie verwenden, wenn Sie etwas nicht mögen? So etwas wieack file_with_long_lines | grep pattern
? :-)ack
(bekannt alsack-grep
Debian) istgrep
auf Steroiden. Es hat auch die--thpppt
Option (kein Scherz). betterthangrep.com--thpppt
Funktion etwas umstritten ist, scheint der entscheidende Vorteil zu sein , dass Sie Perl verwenden können Regexes direkt, nicht ein paar verrückten[[:space:]]
und Zeichen wie{
,[
etc. mit dem Bedeutungswandel-e
und-E
schaltet in eine Weise , die zu erinnern , unmöglich ist.Antworten:
Sie können die Option grep verwenden
-o
, möglicherweise in Kombination mit dem Ändern Ihres Musters".{0,10}<original pattern>.{0,10}"
in, um einen Kontext zu sehen:..oder
-c
:quelle
$ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt
DruckeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
Leiten Sie Ihre Ergebnisse durch
cut
. Ich denke auch darüber nach, einen--cut
Schalter hinzuzufügen , damit man sagen--cut=80
und nur 80 Spalten erhalten kann.quelle
| cut=c1-120
den Grep angehängt , für mich gearbeitet (obwohl ich nicht weiß, wie man passenden Text umschneidet )| cut=c1-120
hat nicht für mich funktioniert, ich musste tun| cut -c1-120
| cut -c 1-100
stackoverflow.com/a/48954102/1815624--no-wrap
Option, die verwendet$COLUMNS
?Sie könnten weniger als Pager verwenden, um lange Schlangen zu bestätigen und zu hacken:
ack --pager="less -S"
Dadurch wird die lange Zeile beibehalten, aber in einer Zeile belassen, anstatt sie zu umbrechen. Um mehr von der Linie zu sehen, scrollen Sie mit den Pfeiltasten weniger nach links / rechts.Ich habe den folgenden Alias eingerichtet, damit ack dies tun kann:
quelle
--pager
Befehl in Ihre ~ / .ackrc-Datei einfügen können, wenn Sie ihn immer verwenden möchten.ack
.erhält Zeichen von 1 bis 100.
quelle
Entnommen aus: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/
Der vorgeschlagene Ansatz
".{0,10}<original pattern>.{0,10}"
ist vollkommen gut, außer dass die Hervorhebungsfarbe oft durcheinander gebracht wird. Ich habe ein Skript mit einer ähnlichen Ausgabe erstellt, aber die Farbe bleibt auch erhalten:Angenommen, das Skript wird als gespeichert
grepl
, danngrepl pattern file_with_long_lines
sollten die übereinstimmenden Zeilen angezeigt werden, jedoch mit nur 10 Zeichen um die übereinstimmende Zeichenfolge.quelle
Folgendes mache ich:
In meinem .bash_profile überschreibe ich grep so, dass es automatisch
tput rmam
vorher undtput smam
nachher ausgeführt wird, wodurch das Umbrechen deaktiviert und dann wieder aktiviert wird.quelle
In der ungewöhnlichen Situation, in der Sie nicht verwenden können
-E
, können Sie Folgendes verwenden:quelle
Ich habe folgendes in mein
.bashrc
:Sie können dann
grepl
in der Befehlszeile alle Argumente verwenden, für die verfügbar istgrep
. Verwenden Sie die Pfeiltasten, um das Ende längerer Zeilen anzuzeigen. Verwenden Sieq
zu beenden.Erläuterung:
grepl() {
: Definieren Sie eine neue Funktion, die in jeder (neuen) Bash-Konsole verfügbar ist.$(which grep)
: Holen Sie sich den vollständigen Weg vongrep
. (Ubuntu definiert einen Aliasgrep
, der dem entsprichtgrep --color=auto
. Wir wollen diesen Alias nicht, sondern das Originalgrep
.)--color=always
: Färben Sie die Ausgabe. (--color=auto
Der Alias funktioniert nicht, dagrep
festgestellt wird, dass die Ausgabe in eine Pipe eingefügt wird, und sie dann nicht eingefärbt wird.)$@
: Setzen Sie alle Argumente auf diegrepl
Funktion ein.less
: Zeigen Sie die Linien mit anless
-R
: Farben anzeigenS
: Brechen Sie keine langen Schlangenquelle