Ich verwende AIX 6.1, das die folgenden In- -B
und -A
Flags 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}
. $NAME
ist in eindeutig Database alias
.
Und die db2 LIST DB DIRECTORY
Ausgabe 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=OLTPF
Ausgabe lautet:
Database alias = OLTPF
Database name = OLTP
Node name = OLTPN
Database release level = 10.00
Comment =
Directory entry type = Remote
Denn NAME=OLTPE
es 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 DIRECTORY
Befehl 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