Línea grep después/antes de la sustitución -A/-B en AIX

Línea grep después/antes de la sustitución -A/-B en AIX

Estoy usando AIX 6.1 que no admite -Bni -Amarca:

grep: Not a recognized flag: B

Digamos que quiero ejecutar:

cat file | grep -E -B4 'Directory entry type.*Indirect' | grep "Database name" | awk  '{print $4}'

¿Cómo puedo hacer este tipo de lógica en AIX?

EDITAR

Mi código real es el siguiente:

NAME_EXISTS=`db2 LIST DB DIRECTORY | grep -E -B5 'Directory entry type.*Remote' | grep "Database alias" | awk '{print $4}' | grep -i ${NAME} | wc -l`
if [ ${NAME_EXISTS} -gt 0 ]; then
    db2 LIST DB DIRECTORY | grep -E -A5 "Database alias.*${NAME}"
fi

La idea es encontrar si hay una base de datos remota con nombre $NAME, si la encuentra, muestra las 5 líneas que comienzan Database alias.*${NAME}. $NAMEes único en Database alias.

Y el db2 LIST DB DIRECTORYresultado es algo como esto:

 System Database Directory

 Number of entries in the directory = 3

Database 1 entry:

 Database alias                       = OLTPA
 Database name                        = OLTPA
 Local database directory             = /db2/data
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

Database 2 entry:

 Database alias                       = OLTPF
 Database name                        = OLTP
 Node name                            = OLTPN
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Remote
 Catalog database partition number    = -1
 Alternate server hostname            =
 Alternate server port number         =

Database 3 entry:

 Database alias                       = ADMIN
 Database name                        = ADMIN
 Local database directory             = /db2/data
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

Para NAME=OLTPFla salida será:

 Database alias                       = OLTPF
 Database name                        = OLTP
 Node name                            = OLTPN
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Remote

Porque NAME=OLTPEno habrá salida.

Respuesta1

ed puede proporcionar una forma sencilla de completar esta tarea.

Si podemos asumir que solo hay una coincidencia, entonces una alternativa a su canalización, usando ed y eliminando el gato innecesario y el grep secundario:

ed -s file <<\EOED | awk '/Database name/ {print $4}'
    /Directory entry type.*Indirect/-4,//p
    q
EOED

Si hay varios,no superpuestocoincidencias, el comando global de ed se puede utilizar para marcarlas:

ed -s file <<\EOED | awk '/Database name/ {print $4}'
    g/Directory entry type.*Indirect/-4,.p
    q
EOED

Para demostrar el caso de coincidencias superpuestas, suponiendo que coincidamos con la cadena foo, que hay coincidencias en las líneas 7 y 9, y que tomamos las tres líneas anteriores de cada coincidencia como contexto, el resultado se vería así:

line 4      <--- context
line 5      <--- context
line 6      <--- context
line 7 foo  <--- matched
line 6      <--- context      <--- repeated
line 7 foo  <--- context      <--- repeated
line 8      <--- context
line 9 foo  <--- matched
line 10
line 11

Respuesta2

Yo lo haría un poco diferente. Primero, ejecute el db2 LIST DB DIRECTORYcomando y guarde su resultado en un archivo de texto. De esa manera, no es necesario volver a ejecutarlo varias veces. Luego, para cada uno de los nombres de sus objetivos, pase el nombre a un script awk que recopile las líneas relevantes:

## Run the db command
tempfile=$(mktemp)
db2 LIST DB DIRECTORY > "$tmpfile"
## I am assuming you will have a loop for the different target names
for name in OLTPF OLTPA; do
  awk -v name="$name" '{
       if(/Database alias/){n=$4; a[n]=$0; i=1}
       if (i<=6 && i>1){ a[n]=a[n]"\n"$0}
       i++;
      }END{if(name in a){print a[name]}}' $tempfile
done

Respuesta3

$ awk -v RS= -F'\n' -v OFS='\n' '$1 ~ " OLTPF$"{for (i=1;i<=6;i++) print $i}' file
 Database alias                       = OLTPF
 Database name                        = OLTP
 Node name                            = OLTPN
 Database release level               = 10.00
 Comment                              =
 Directory entry type                 = Remote

información relacionada