2010-01-09 6 views
57

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 juste voir cette partie d'une longue ligne qui entoure une chaîne qui correspond à l'expression régulière. Comment puis-je l'obtenir en utilisant une combinaison d'outils Unix?Comment tronquer de longues lignes correspondantes renvoyées par grep ou ack

+1

Qu'est-ce 'ack'? Est-ce une commande que vous utilisez lorsque vous n'aimez pas quelque chose? Quelque chose comme 'ack file_with_long_lines | motif de grep'? :-) –

+6

@Alok 'ack' (connu sous le nom de' ack-grep' sur Debian) est 'grep' sur les stéroïdes. Il a aussi l'option '--thpppt' (sans blague). http://betterthangrep.com/ – ZoogieZork

+0

Merci. J'ai appris quelque chose aujourd'hui. –

Répondre

57

Vous pouvez utiliser l'option grep -o, éventuellement en combinaison avec la modification de votre modèle à ".{0,10}<original pattern>.{0,10}" afin de voir un peu de contexte autour:

 
     -o, --only-matching 
       Show only the part of a matching line that matches PATTERN. 

..ou -c:

 
     -c, --count 
       Suppress normal output; instead print a count of matching lines 
       for each input file. With the -v, --invert-match option (see 
       below), count non-matching lines. 
+21

un exemple: grep -oE ". {0,20} mysearchstring. {0,20}" myfile – Renaud

+9

vous devriez changer la réponse à ajouter -E option comme indiqué par @Renaud (option de modèle étendu), ou le modèle proposé pour l'extension du contexte ne fonctionnera pas. – kriss

28

pipe vos résultats par cut. J'envisage également d'ajouter un commutateur --cut de sorte que vous pouvez dire --cut = 80 et seulement 80 colonnes.

+5

Que faire si la partie correspondante ne figure pas dans les 80 premiers caractères? – Ether

+3

FWIW J'ai ajouté '' | couper = c1-120' pour le grep, a travaillé pour moi (mais je ne sais pas comment couper autour du texte correspondant) –

+17

'' | cut = c1-120'' ne fonctionnait pas pour moi, je devais faire '' | cut -c1-120'' –

17

Vous pouvez utiliser moins comme téléavertisseur pour les longues lignes ACK et Hacher: ack --pager="less -S" Ceci conserve la ligne longue mais la laisse sur une ligne au lieu de l'envelopper. Pour voir plus de la ligne, faites défiler gauche/droite en moins avec les touches fléchées.

J'ai la configuration d'alias suivant pour ack faire ceci:

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

Veuillez noter que vous pouvez mettre cette commande '--pager' dans votre fichier ~/.ackrc, si vous voulez toujours l'utiliser. –

+0

Cela semble être la meilleure solution de loin à ce problème qui me dérange beaucoup. Je voudrais savoir comment utiliser 'ack'. –

1

Extrait de: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/

L'approche proposée ".{0,10}<original pattern>.{0,10}" est tout à fait bon, sauf que la couleur de surbrillance est souvent foiré. 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é en tant que grepl, puis grepl pattern file_with_long_lines devrait afficher les lignes de correspondance, mais avec seulement 10 caractères autour de la chaîne correspondante.

0
cut -c 1-100 

obtient les caractères de 1 à 100.

Questions connexes