Linha grep após / antes da substituição -A / -B no AIX

1

Estou usando o AIX 6.1 que não está suportando em -B e -A flags:

grep: Not a recognized flag: B

Digamos que eu queira executar:

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

Como posso fazer esse tipo de lógica no AIX?

EDITAR

Meu código real é o seguinte:

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

A idéia é descobrir se existe um banco de dados remoto chamado $NAME , se ele encontrar - mostre as 5 linhas começando com Database alias.*${NAME} . $NAME é exclusivo em Database alias .

E a saída db2 LIST DB DIRECTORY é algo assim:

 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=OLTPF , a saída será:

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

Para NAME=OLTPE não haverá saída.

    
por Nir 16.02.2016 / 08:54

2 respostas

0

Eu faria de forma um pouco diferente. Primeiro, execute o comando db2 LIST DB DIRECTORY e salve sua saída em um arquivo de texto. Dessa forma, você não precisa executar novamente várias vezes. Em seguida, para cada um dos seus nomes de destino, passe o nome para um script do awk que coleta as linhas 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
    
por 16.02.2016 / 11:51
2

ed pode fornecer uma maneira simples de concluir essa tarefa.

Se pudermos supor que existe apenas uma única correspondência, então uma alternativa ao seu pipeline, usando ed e eliminando o gato desnecessário e o grep secundário:

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

Se houver várias correspondências não sobrepostas , o comando global do ed poderá ser usado para marcá-las:

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

Para demonstrar o caso de correspondências sobrepostas, supondo que estejamos combinando a string foo , e há correspondências nas linhas 7 e 9, e estamos puxando as três linhas precedentes de cada correspondência como contexto, a saída seria semelhante a isso:

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
    
por 16.02.2016 / 09:57