Grep-Zeile nach/vor -A/-B-Ersetzung in AIX

Grep-Zeile nach/vor -A/-B-Ersetzung in AIX

Ich verwende AIX 6.1, das die folgenden In- -Bund -AFlags nicht unterstützt:

grep: Not a recognized flag: B

Nehmen wir an, ich möchte Folgendes ausführen:

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

Wie kann ich diese Art von Logik in AIX implementieren?

BEARBEITEN

Mein tatsächlicher Code lautet wie folgt:

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

Die Idee besteht darin, herauszufinden, ob eine Remote-Datenbank mit dem Namen vorhanden ist $NAME. Wenn dies der Fall ist, werden die 5 Zeilen angezeigt, die mit beginnen Database alias.*${NAME}. $NAMEist in eindeutig Database alias.

Und die db2 LIST DB DIRECTORYAusgabe sieht ungefähr so ​​aus:

 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         =

Die NAME=OLTPFAusgabe lautet:

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

Denn NAME=OLTPEes wird keine Ausgabe geben.

Antwort1

ed bietet möglicherweise eine einfache Möglichkeit, diese Aufgabe zu erledigen.

Wenn wir davon ausgehen können, dass nur eine einzige Übereinstimmung vorliegt, gibt es eine Alternative zu Ihrer Pipeline, bei der ed verwendet und das unnötige cat und sekundäre grep eliminiert werden:

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

Wenn es mehrere gibt,nicht überlappendÜbereinstimmungen können mit dem globalen Befehl von ed markiert werden:

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

Um den Fall überlappender Übereinstimmungen zu demonstrieren, gehen wir davon aus, dass wir die Zeichenfolge abgleichen foo, es Übereinstimmungen in den Zeilen 7 und 9 gibt und wir die drei vorhergehenden Zeilen jeder Übereinstimmung als Kontext verwenden. Die Ausgabe würde dann folgendermaßen aussehen:

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

Antwort2

Ich würde es etwas anders machen. Führen Sie zuerst den db2 LIST DB DIRECTORYBefehl aus und speichern Sie seine Ausgabe in einer Textdatei. Auf diese Weise müssen Sie ihn nicht mehrmals erneut ausführen. Übergeben Sie dann für jeden Ihrer Zielnamen den Namen an ein awk-Skript, das die relevanten Zeilen sammelt:

## 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

Antwort3

$ 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

verwandte Informationen