awkSoluciones sencillas :
Suponga que la expresión regular que se utilizará para encontrar líneas coincidentes se almacena en la variable de shell $regexy el recuento de líneas para saltar $count.
Si también se debe omitir la línea coincidente ( $count + 1se omiten las líneas):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Si la línea coincidente no debe omitirse (se omiten las$count líneas posteriores a la coincidencia):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Explicación:
-v regex="$regex" -v count="$count"define awkvariables basadas en variables de shell del mismo nombre.
$0 ~ regex coincide con la línea de interés
{ skip=count; next }inicializa el recuento de saltos y pasa a la siguiente línea, saltando efectivamente la línea correspondiente; en la segunda solución, los printantes nextasegura que es no saltarse.
--skip >= 0 disminuye el número de saltos y actúa si es (todavía)> = 0, lo que implica que la línea en cuestión debe omitirse.
{ next } pasa a la siguiente línea, saltándose efectivamente la línea actual
1es una abreviatura de uso común para { print }; es decir, la línea actual simplemente se imprime
- Solo las líneas que no coinciden ni se omiten llegan a este comando.
- La razón por la que
1es equivalente a { print }es que 1se interpreta como un patrón booleano que por definición siempre se evalúa como verdadero, lo que significa que su acción asociada (bloque) se ejecuta incondicionalmente. Dado que no hay ninguna acción asociada en este caso, el valor awkpredeterminado es imprimir la línea.
+Npatrón es una extensión GNU. Cambie el primerona anNen su segundo ejemplo para que incluya la línea con el patrón.