Disons que j'ai le fichier suivant:
$ cat test
test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4
Par défaut, grep
chaque ligne contenant le terme recherché est renvoyée:
$ grep test test
test line 1
test line 2
test line 3 with two test words
test line 4
Si vous passez le --color
paramètre à, il grep
mettra en surbrillance la partie de la ligne qui correspond à l'expression recherchée, mais ne renvoie toujours que les lignes contenant l'expression. Existe-t-il un moyen de grep
générer chaque ligne du fichier source, mais de mettre en évidence les correspondances?
Mon terrible piratage actuel pour y parvenir (du moins sur les fichiers ne contenant pas plus de 10000 lignes consécutives sans correspondance) est le suivant:
$ grep -B 9999 -A 9999 test test
Si cela grep
n’est pas possible, existe-t-il un autre outil de ligne de commande offrant les mêmes fonctionnalités? J'ai tripoté avec ack
, mais il ne semble pas avoir une option pour cela non plus.
la source
-C 9999
à la place de-A 9999 -B 9999
.Je fais toujours:grep -C 9999 pattern file
Réponses:
Ce que nous faisons ici correspond au
$
motif et au motif de test. De toute évidence, il n’ya$
rien à colorer, donc seul le motif de test obtient la couleur. Il-E
suffit d'activer la correspondance regex étendue.Vous pouvez facilement créer une fonction comme ceci:
la source
highlight () { grep --color -E "$1|$" $2 ; }
. Utilisation:highlight test yourfile
"$2"
devrait également être cité.highlight () { grep --color -E "$1|$" "$@" }
qui autorise les fichiers avec des espaces dans leurs noms et plusieurs fichiers."$1"
dans les fichiers. Utilisationhighlight () { grep --color -E "$1|$" "${@:1}" }
pour Ubuntu et Debian, utilisez ack-grep au lieu de ack
la source
--regexp string
; L'équivalent ack / ack-grep est--match string
ack --passthru
avec perl:grep_passthrough () { ! perl -ne "print; \$e ||= /$@/; END{{exit \$e}}"; }
ack --passthru
fonctionne également sur les flux! Par exemple,ifconfig | ack --passthru inet
Une autre façon de le faire correctement et portably avec
grep
( en plus d' utiliser deux expressions rationnelles avec l' alternance comme dans la réponse acceptée) est par le motif vide (et chaîne respectivement null).Il devrait fonctionner aussi bien avec les deux
-E
et les-F
commutateurs puisque, selon la norme :et
Donc, il s'agit simplement de courir
et respectivement
la source
grep -F -e '' -e 'string'
.seq 3 | grep -F -e '' -e 2
ne sort que 2 en 2.27 (et 2.26, mais pas 2.25, et pas dans la tête de git). Seulement avec-F
(pas sans ou avec -E). IOW, seulement 2.26 et 2.27 semblent avoir le bogue et seulement avec -F.seq 3 | grep -F -e '' -e '' -e 2
cela semble fonctionner aussi bien avec 2.27-F
, ce qui évite d'avoir à s'inquiéter des caractères qui apparaissent dans les caractèresstring
. Vous voudrez peut-être mentionner--color
; Comme cette réponse flotte sur la page (vue par les votes), plus de personnes pourraient finir de la lire avant les autres réponses.J'ai la fonction suivante que j'utilise pour de telles choses:
En interne, ça a l'air un peu moche, c'est gentil et facile à utiliser, comme ça:
ou, pour un exemple un peu plus réel:
Vous pouvez modifier les couleurs comme bon vous semble (ce qui pourrait être difficile avec grep - je ne suis pas sûr) en modifiant les valeurs
1
and31
et43
(after\e[
) en valeurs différentes. Les codes à utiliser sont tous sur le lieu , mais voici une intro rapide: les 1 Bolds le texte, la31
rend rouge, et43
donne un fond jaune.32
ou33
serait différentes couleurs, ou44
ou45
seraient différents milieux: vous avez l'idée. Vous pouvez même le faire clignoter (avec un5
) si vous êtes si enclin.Cela n'utilise pas de modules Perl spéciaux, et Perl est presque omniprésent, alors je m'attendrais à ce qu'il fonctionne à peu près n'importe où. La solution grep est très intelligente, mais le commutateur --color de grep n’est pas disponible partout. Par exemple, je viens d’essayer cette solution sur une machine Solaris exécutant bash et une autre machine exécutant ksh et ma machine Mac OS X locale exécutant zsh. Tout a bien fonctionné. Solaris a toutefois étouffé la
grep --color
solution.De plus, ack est génial, et je le recommande à tous ceux qui ne l’ont pas encore découvert, mais j’ai eu quelques problèmes pour l’installer sur quelques-uns des nombreux serveurs sur lesquels je travaille. (J'oublie pourquoi: je pense que cela est lié aux modules Perl.)
Étant donné que je ne pense pas avoir déjà travaillé sur un système Unix sur lequel Perl n'est pas installé (à l'exception des systèmes de type intégré, des routeurs Linksys, etc.), je dirais que cette solution est utilisable de manière universelle. .
la source
Au lieu d'utiliser Grep, vous pouvez utiliser Less:
Rechercher comme ceci:
/pattern
EnterCette volonté:
Pour faire défiler jusqu'à la ligne correspondante suivante:
n
Pour faire défiler jusqu'à la ligne correspondante précédente:
N
Pour activer la surbrillance: Esc
u
Vous pouvez aussi changer la couleur de surbrillance si vous le souhaitez.
la source
Tu peux essayer:
Pas très portable cependant, et même si Perl est installé, vous devrez peut-être télécharger un autre module. De plus, il colorera toute la ligne, pas seulement le mot recherché.
la source
ripgrep
Utiliser
ripgrep
avec son--passthru
paramètre:C'est l'un des outils de recherche les plus rapides , car il est construit sur le moteur de regex de Rust qui utilise des automates finis, SIMD et des optimisations littérales agressives pour rendre la recherche très rapide.
la source
Il existe un moyen beaucoup plus simple de faire cela pour GNU grep mais je ne pense pas que ce soit portable (c'est-à-dire BSD grep):
Dans une pipe:
cat <file> | grep --color=always -z <query>
Sur un fichier:
grep --color=always -z <query> <file>
Le mérite en revient à la réponse de Cyrus ici .
la source
--color
n'est pas la norme non plus.)Aucune des réponses fournies jusqu'à présent ne fournit une solution portable .
Voici un portable 1 fonction shell I déjà posté dans un endroit fermé en double question qui ne nécessite pas d' outils non standard ou extensions non standard fournis avec
perl
,ack
,ggrep
,gsed
,bash
et les goûts , mais n'a besoin que d' un shell POSIX et les services publics obligatoires POSIXsed
etprintf
:Vous pouvez l'utiliser de cette façon:
La couleur de surbrillance peut être ajustée en utilisant l’un des codes suivants dans l’argument de la commande sed (32m étant vert ici):
1 Tant que votre terminal prend en charge les séquences d'échappement de couleurs ANSI.
la source
Une
sed
version, fonctionne à la foisbash
etash
.la source
OP a demandé
grep
, et c'est ce que je recommande ; mais après avoir essayé de résoudre un problème avecsed
, pour mémoire, voici une solution simple:ou
Va peindre
main
en rouge.\E[31m
: séquence de démarrage de couleur rouge\E[0m
: marque de couleur finie&
: le motif assorti/g
: tous les mots en ligne, pas seulement le premier$'string'
est des chaînes bash avec des caractères d'échappement interprétésEn ce qui concerne grep , cela fonctionne également en utilisant
^
(début de ligne) au lieu de$
(fin de ligne). Exemple:Et juste pour montrer cet alias fou que je ne recommande pas , vous pouvez même laisser les guillemets ouverts:
tout le travail! :) Ne vous inquiétez pas si vous oubliez de fermer la citation, bash se souviendra de vous avec un "caractère de ligne continue".
la source