2016-09-22 2 views
0

Je dois donc sortir chaque ligne entre deux lignes presque identiques et éventuellement identiques d'un fichier journal.BASH - Sortie de toutes les lignes entre (et incluant) deux lignes identiques/presque identiques

Le journal ressemble à ceci:

Sat Sep 17 13:03:53 
FOOBAR 
this is FOO 
Sun Sep 18 12:04:12 
FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 
Mon Sep 19 00:00:01 
FOO-1543 BAR 
FOO-1543 Test 
Tue Sep 20 16:13:37 
FOO-1543 BAR 
FOO-1543 Test 

Et ainsi de suite.

J'ai déjà essayé d'utiliser

sed -n '/FOO-1543/,/FOO-1543/p' ${input} >> ${output} 
sed -n '/^\FOO-1543/,/^\FOO-1543/p' ${input} >> ${output} 
awk '/FOO-1543/,/FOO-1543/' ${input} >> ${output} 
awk '/^\FOO-1543/,/^\FOO-1543/' ${input} >> ${output} 

La sortie que je reçois de ces:

FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 

La sortie Je veux:

FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 
Mon Sep 19 00:00:01 
FOO-1543 BAR 
FOO-1543 Test 
Tue Sep 20 16:13:37 
FOO-1543 BAR 
FOO-1543 Test 

J'ai besoin de sortie chaque ligne à partir de le premier FOO-1543 jusqu'à la toute dernière fois il apparaît dans le document y compris lin es qui ne contiennent pas FOO-1543 mais se situent entre la toute première et la dernière ligne contenant FOO-1543.

Le numéro de ligne peut varier, le début des lignes reste toujours le même.

S'il vous plaît laissez une explication de la solution si possible.

+0

Umm 'grep "^ Foo-" entrée'? – VM17

+0

Je ne comprends pas ce que l'exigence de quoi extraire est? Quelles lignes est-il entre? – 123

+0

La question n'est pas claire du tout. Veuillez développer l'exemple pour mieux illustrer ce que vous voulez. – VM17

Répondre

1

Si vous souhaitez imprimer toutes les lignes entre la première et la dernière apparition de FOO-, vous pouvez utiliser les éléments suivants:

awk '/^FOO-/{if(!b)b=NR;e=NR} {a[NR]=$0} END{for(i=b;i<=e;i++) print a[i]}' file 

Cela établit la ligne de départ avec l'index b et la ligne de fond avec e.

Le fichier entier est dupé dans un tableau a. Les lignes voulues sont imprimées sur la base des 2 index b et e dans l'instruction END.

0

Si la solution perl est correct:

$ perl -ne 'print if /^FOO-1543/.../^FOO-1543/' ip.txt 
FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 
FOO-1543 BAR 
FOO-1543 Test 
Mon Sep 19 00:00:01 
FOO-1543 BAR 
FOO-1543 Test 
Tue Sep 20 16:13:37 
FOO-1543 BAR 
FOO-1543 Test 

La version ... de range operator est nécessaire dans ce cas

sed -n '/^FOO-1543/,/^FOO-1543/p' ip.txt fonctionne aussi bien pour moi sur GNU sed 4.2.2