imprimer une ligne spécifique, puis un peu plus


1

J'essaie de rechercher un motif dans un fichier et si on le trouve, je veux voir la ligne et 10 autres lignes du résultat.

jusqu'ici j'ai

grep -n pattern file | cut -d: f1 

maintenant pas sûr de savoir comment utiliser cette out mis à faire l'impression avec la logique comme

sed -n result,(result+10)p file

va probablement en avoir quelques-unes si le motif est sur plusieurs lignes.

Toute aide est appréciée

linux  bash  unix 

Réponses:


0

si grep -Ane fonctionne pas, essayez

awk '/pattern/ {for(i=0;i<number_of_lines;i++){print;getline}}' <filename>

d'autre sed a une autre solution sale

sed -n '/pattern/ {p;n;p;n;p;...}' <filename>ici p-> imprimer, n-> aller à la ligne suivante. Donc, nombre de p est votre nombre de lignes à imprimer

Mettre à jour:

utiliser comme fonction, écrire dans un test.sh

jobcheck(){
  awk "/$1/"' {for(i=0;i<10;i++){print;getline}}' $2
}

alors juste

source test.sh

courir,

jobcheck "pattern" "file"

Mise à jour: selon la suggestion de Jonathan Leffler, si l'une des 10 lignes suivantes contient le motif, le comptage doit commencer à partir de cette ligne afin

pattern  ->start printing from here to next 10 lines
blah
blah
pattern  ->forget about the last 2 lines, start counting from here
blah 
blah

Donc, la commande awk mise à jour sera comme

awk '/pattern/{max_line=NR+2} {if(NR<=max_line) print}' <filename>

De même, Jobcheck sera également modifié. À votre santé:)


Génial, comment puis-je utiliser cette fonction comme: jobcheck () {awk '/ $ 1 / {pour (i = 0; i <10; i ++) {print; getline}}' $ 2}

J'ai mis à jour la réponse pour cela :)

Notez que si les motifs apparaissent sur les 10 lignes suivantes, vous devez (probablement) réinitialiser le compteur d’impression. Ou concevez-le pour que, lorsque vous trouvez le match, vous définissiez max_print = NR + 10;, puis pour chaque ligne,if (NR < max_print) print
Jonathan Leffler

oui, c'est une bonne suggestion, a mis à jour la réponse :)

hmm J'ai mis cette fonction dans mon ~ / .bashrc car elle est courte mais j'ai une erreur qui dit une erreur de syntaxe: fin inattendue du fichier. Je n'ai même pas mis la fonction à la fin du fichier cependant. Vous savez quel pourrait être le problème?

4

Utiliser grep 2.10:

grep -A 10 "pattern" your_file

imprimera 10 lignes après le match

Depuis la page de manuel de grep :

-Un chiffre

--after-context = num

Imprimer les lignes numériques du contexte de fin après les lignes correspondantes.

Utiliser GNU awk 3.1.8:

awk '{if(a-->0) {print; next}} /pattern/{print; a=10}' your_file

ça dit option illégale pour moi. Je suis sur bash 3.0.19 je crois

Votre version de grep est l’information importante. grep -V
Fred Thomsen

oui, même c'est une option illégale. Je suppose que mes affaires sont vraiment obsolètes?

@yatici a mis à jour avec une awkapproche
Alex

Vous utilisez peut-être une version allégée de grep. Si vous êtes sur une distribution basée sur RPM, vous pouvez probablement le faire rpm -ql grepou sur une distribution basée sur DEB, dpkg -l greppour obtenir la version.
Wodin

0

J'utiliserais:

sed -n '/pattern/{N;N;N;N;N;N;N;N;N;N;p;}'

ou

sed '1,/pattern/{/pattern/!d;}' | sed '12,$d'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.