Je sais qu'avec grep je peux utiliser les champs -A
et -B
extraire les lignes précédentes et suivantes d'une correspondance.
Cependant, ils tirent toutes les lignes entre le match en fonction du nombre de lignes spécifié.
grep -r -i -B 5 -A 5 "match"
Je souhaite recevoir uniquement la 5ème ligne avant un match et la 5ème ligne après le match en plus de la ligne correspondante et ne pas séparer les lignes.
Existe-t-il un moyen de le faire avec le grep
?
command-line
grep
awk
chollida
la source
la source
grep -r -i -B 5 -A 5 "match" | sed -e 1b -e '$!d'
Réponses:
L'outil que vous souhaitez utiliser s'appelle tamiser. Il s'agit essentiellement d'un grep sur les stéroïdes. Grep en parallèle. Sift a une énorme quantité d'options pour faire exactement ce que vous voulez - spécifiquement pour renvoyer une ligne particulière par rapport à une correspondance qui peut / peut ne pas être suivie / précédée d'un texte.
Cela m'étonne que sift ne soit pas un gnu traditionnel car il a été écrit dans la langue go mais s'installe très bien sur Linux. Le service informatique recherche en parallèle en utilisant toutes les énormes quantités de texte des processeurs, où grep ne prend que des semaines pour faire de même.
Site Web de Sift - voir des exemples
la source
Si:
Puis:
la source
/match/ {matched[NR]}
? Je n'ai jamais vu un tableau ou une variable comme une commande entière. Est-ce mettre le numéro d'enregistrement actuel de chaque ligne correspondante dans le tableau.key in array
. Ce que je fais, c'est me souvenir des numéros de ligne où le motif apparaîtIl s'agit essentiellement de la solution de Glenn, mais implémentée avec Bash, Grep et sed.
Notez que les numéros de ligne inférieurs à 1 entraîneront une erreur sed et que les numéros de ligne supérieurs au nombre de lignes du fichier ne l'imprimeront pas.
C'est juste le strict minimum. Pour le faire fonctionner récursivement et gérer les cas de numéro de ligne ci-dessus, il faudrait un peu de travail.
la source
Cela ne peut pas être fait avec seulement
grep
. Si c'ested
une option:Le script dit essentiellement: pour chaque correspondance de / match /, imprimez la ligne 5 lignes avant cela, puis 5 lignes après cela, puis 5 lignes après cela.
la source
ed
est toujours une réponse, cared
est l'éditeur de texte standard.grep
réponse, la réponse "Vous ne pouvez pas le faire avec X, mais vous pouvez le faire avec Y, voici comment" est toujours une réponse valide car non seulement vous répondez à la question d'OP mais vous fournissez également une alternative Ça marcherait. C'est un type de réponse valide ici.Ici, nous utilisons la fonction awk pour appeler une commande externe pour imprimer les lignes qui correspondent à awk avec le motif avec les 5 ème lignes avant et après la correspondance.
system(command)
sed
match
La syntaxe est facile, il vous suffit de mettre la commande externe elle-même dans les guillemets doubles ainsi que ses commutateurs et d'échapper les choses que vous voulez exactement passer à la commande, tout le reste lié aux
awk
options lui - même devrait être en dehors des guillemets. Donc, le sed ci-dessous :se traduire par:
NR
est le numéro de ligne correspondant au modèlematch
etFILENAME
le nom du fichier de traitement en cours qui passeawk
.la source
en utilisant l'exemple de fichier texte de @ glenn et en utilisant perl au lieu de awk:
donnera les mêmes résultats, mais en cours d'exécution plus rapide:
la source