Imprimir línea específica y luego algo más


1

Estoy intentando buscar un patrón en un archivo y si se encuentra, quiero ver la línea y 10 líneas más del resultado.

hasta ahora tengo

grep -n pattern file | cut -d: f1 

Ahora no estoy seguro de cómo utilizar este puesto para hacer la impresión con la lógica como

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

Probablemente va a tener algunos emitidos si el patrón está en varias líneas.

Cualquier ayuda es apreciada

linux  bash  unix 

Respuestas:


0

Si grep -A no está funcionando, intente

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

si no, sed tiene otra solución sucia

sed -n '/pattern/ {p;n;p;n;p;...}' <filename> aquí p- & gt; imprimir, n - & gt; llegar a la siguiente línea Así que el número de p es el número de líneas a imprimir.

Actualizar:

para usar como una función, escriba en un test.sh

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

entonces solo

source test.sh

correr,

jobcheck "pattern" "file"

Actualizar: según la sugerencia de Jonathan Leffler, si alguna de las siguientes 10 líneas contiene el patrón, el conteo debe comenzar desde esa línea para que

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

Así que el comando awk actualizado será como

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

Del mismo modo, dentro de la comprobación de trabajo también se cambiará. Aclamaciones:)


Impresionante, ¿cómo puedo hacer de esta una función como: jobcheck () {awk '/ $ 1 / {for (i = 0; i & lt; 10; i ++) {print; getline}}' $ 2}

Actualicé la respuesta para eso :)

Tenga en cuenta que si los patrones aparecen en las siguientes 10 líneas, debería (probablemente) restablecer el 'contador de impresión'. O diseñarlo para que cuando encuentres la coincidencia, configures max_print = NR + 10; y luego para cada línea, if (NR < max_print) print
Jonathan Leffler

Sí, esa es una buena sugerencia, actualicé la respuesta :)

hmm Puse esta función en mi ~ / .bashrc ya que es breve pero recibí un error al decir error de sintaxis: final inesperado del archivo. Aunque ni siquiera puse la función al final del archivo. ¿Sabes cuál podría ser el problema?

2

Utilizando grep 2.10:

grep -A 10 "pattern" your_file

Imprimirá 10 líneas después del partido.

Desde el grep man page :

-Un numero

--after-context = num

Imprimir líneas numéricas de contexto final después de líneas coincidentes.

Usando GNU awk 3.1.8:

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

Dice opción ilegal para mí. Estoy en bash 3.0.19 creo

Su versión grep es la información importante. grep -V
Fred Thomsen

sí, incluso eso es una opción ilegal. ¿Asumo que mis cosas están realmente desactualizadas?

@yatici actualizado con un awk enfoque
Alex

Puede que estés usando alguna versión reducida de grep. Si estás en una distribución basada en RPM, probablemente puedas hacer rpm -ql grep o en una distribución basada en DEB, dpkg -l grep para conseguir la versión.
Wodin

0

Yo uso

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

o

sed '1,/pattern/{/pattern/!d;}' | sed '12,$d'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.