Je veux exécuter ack ou grep sur des fichiers HTML qui ont souvent de très longues lignes. Je ne veux pas voir de très longues lignes qui s'enroulent à plusieurs reprises. Mais je veux voir juste cette partie d'une longue ligne qui entoure une chaîne qui correspond à l'expression régulière. Comment puis-je obtenir cela en utilisant n'importe quelle combinaison d'outils Unix?
90
ack
? Est-ce une commande que vous utilisez lorsque vous n'aimez pas quelque chose? Quelque chose commeack file_with_long_lines | grep pattern
? :-)ack
(connu sousack-grep
le nom de Debian) estgrep
sous stéroïdes. Il a également l'--thpppt
option (sans blague). betterthangrep.com--thpppt
fonction est quelque peu controversée, l'avantage clé semble être que vous pouvez utiliser Perl Regexes directement, pas un fou[[:space:]]
et des personnages comme{
,[
, etc. En changeant le sens avec le-e
et les-E
commutateurs d'une manière qui est impossible de se souvenir.Réponses:
Vous pouvez utiliser l'option grep
-o
, éventuellement en combinaison avec le changement de votre modèle".{0,10}<original pattern>.{0,10}"
afin de voir un contexte autour de lui:..ou
-c
:la source
$ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt
tiragesqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
oE ".{0,20}mysearchstring.{0,20}"
vous perdez la mise en évidence de la chaîne "originale" interne par rapport au contexte, car l'ensemble devient le modèle de recherche. J'adorerais trouver un moyen de conserver un contexte non mis en évidence autour des résultats de la recherche, pour une analyse visuelle et une interprétation des résultats beaucoup plus faciles.-oE ".{0,x}foo.{0,x}"
approche (oùx
est le nombre de caractères du contexte) - append `| grep foo `jusqu'à la fin. Fonctionne pour les solutions ack ou grep. Plus de solutions également ici: unix.stackexchange.com/questions/163726/…Transmettez vos résultats
cut
. J'envisage également d'ajouter un--cut
commutateur pour que vous puissiez dire--cut=80
et n'obtenir que 80 colonnes.la source
| cut=c1-120
au grep, a travaillé pour moi (mais je ne sais pas comment couper le texte correspondant)| cut=c1-120
n'a pas fonctionné pour moi, j'avais besoin de le faire| cut -c1-120
| cut -c 1-100
stackoverflow.com/a/48954102/1815624--no-wrap
option qui utilise$COLUMNS
?Vous pouvez utiliser less comme téléavertisseur pour ack et hacher les longues lignes:
ack --pager="less -S"
Cela conserve la longue ligne mais la laisse sur une seule ligne au lieu de l'enrouler. Pour voir plus de la ligne, faites défiler vers la gauche / droite en moins avec les touches fléchées.J'ai la configuration d'alias suivante pour ack pour ce faire:
la source
--pager
commande dans votre fichier ~ / .ackrc, si vous souhaitez toujours l'utiliser.ack
.ack
est à peu près commegrep
, mais plus simple dans les cas les plus courantsobtient des caractères de 1 à 100.
la source
Tiré de: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/
L'approche suggérée
".{0,10}<original pattern>.{0,10}"
est parfaitement bonne sauf que la couleur de surbrillance est souvent foirée. J'ai créé un script avec une sortie similaire mais la couleur est également préservée:#!/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))}"
En supposant que le script est enregistré sous
grepl
, alorsgrepl pattern file_with_long_lines
devrait afficher les lignes correspondantes mais avec seulement 10 caractères autour de la chaîne correspondante.la source
Voici ce que je fais:
Dans mon .bash_profile, je remplace grep pour qu'il s'exécute automatiquement
tput rmam
avant ettput smam
après, ce qui a désactivé l'encapsulation, puis le réactive.la source
Dans la situation inhabituelle où vous ne pouvez pas utiliser
-E
, vous pouvez utiliser:la source
J'ai mis ce qui suit dans mon
.bashrc
:Vous pouvez ensuite utiliser
grepl
sur la ligne de commande tous les arguments disponibles pourgrep
. Utilisez les touches fléchées pour voir la queue des lignes plus longues. Utilisezq
pour quitter.Explication:
grepl() {
: Définissez une nouvelle fonction qui sera disponible dans chaque (nouvelle) console bash.$(which grep)
: Obtenez le chemin complet degrep
. (Ubuntu définit un alias pourgrep
cela équivaut àgrep --color=auto
. Nous ne voulons pas de cet alias mais de l'originalgrep
.)--color=always
: Colorisez la sortie. (à--color=auto
partir de l'alias ne fonctionnera pas cargrep
détecte que la sortie est placée dans un tube et ne la colorera pas ensuite.)$@
: Mettez ici tous les arguments donnés à lagrepl
fonction.less
: Afficher les lignes en utilisantless
-R
: Afficher les couleursS
: Ne cassez pas les longues lignesla source