Suponiendo que desea hacer coincidir la línea completa con su patrón, con GNU sed
, esto funciona:
sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile
Equivalente estándar:
sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile
Con la siguiente entrada ( infile
):
cat 13123 23424
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
El resultado es:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Explicación:
/^dog 123 4335$/
busca el patrón deseado.
:a; n; p; ba;
es un bucle que recupera una nueva línea desde input ( n
), la imprime ( p
) y vuelve a ramificarse para etiquetar a :a; ...; ba;
.
Actualizar
Aquí hay una respuesta que se acerca más a sus necesidades, es decir, patrón en el archivo2, grepping del archivo1:
tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1
El grep y el corte incrustados encuentran la primera línea que contiene un patrón del archivo2, este número de línea más uno se pasa a la cola, el más está allí para omitir la línea con el patrón.
Si desea comenzar desde el último partido en lugar del primer partido, sería:
tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1
Tenga en cuenta que no todas las versiones de tail admiten la notación más.