web-dev-qa-db-fra.com

Comment tronquer les longues lignes correspondantes renvoyées par grep ou ack

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 ne veux voir que la partie d'une longue ligne qui entoure une chaîne qui correspond à l'expression régulière. Comment puis-je obtenir cela en utilisant une combinaison d'outils Unix?

73
dan

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

 -o, --only-matching 
 Afficher uniquement la partie d'une ligne correspondante qui correspond au MOTIF. 

..ou -c:

 -c, --count 
 Supprimer la sortie normale; au lieu de cela, imprimez un nombre de lignes correspondantes 
 pour chaque fichier d'entrée. Avec l'option -v, --invert-match (voir 
 Ci-dessous), comptez les lignes qui ne correspondent pas. 
78
Ether

Envoyez vos résultats par cut. J'envisage également d'ajouter un --cut basculez pour dire --cut=80 et obtenez seulement 80 colonnes.

39
Andy Lester

Vous pouvez utiliser moins comme pageur pour les longues lignes d'acquittement et de hachage: ack --pager="less -S" Ceci conserve la longue ligne mais la laisse sur une seule ligne au lieu d'envelopper. 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:

alias ick='ack -i --pager="less -R -S"' 
21
Jonah Braun
cut -c 1-100

obtient des caractères de 1 à 100.

5
edib

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 bon, sauf que la couleur de surbrillance est souvent gâché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, puis grepl pattern file_with_long_lines devrait afficher les lignes correspondantes mais avec seulement 10 caractères autour de la chaîne correspondante.

1
xuhdev