Я использую AIX 6.1, который не поддерживает флаги -B
и -A
:
grep: Not a recognized flag: B
Допустим, я хочу запустить:
cat file | grep -E -B4 'Directory entry type.*Indirect' | grep "Database name" | awk '{print $4}'
Как реализовать подобную логику в AIX?
РЕДАКТИРОВАТЬ
Мой настоящий код выглядит следующим образом:
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
Идея состоит в том, чтобы найти, существует ли удаленная БД с именем $NAME
, и если она найдена, показать 5 строк, начинающихся с Database alias.*${NAME}
. $NAME
, которые являются уникальными в Database alias
.
И db2 LIST DB DIRECTORY
выводится что-то вроде этого:
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 =
Для NAME=OLTPF
вывода будет:
Database alias = OLTPF
Database name = OLTP
Node name = OLTPN
Database release level = 10.00
Comment =
Directory entry type = Remote
Потому что NAME=OLTPE
выхода не будет.
решение1
ed может предоставить простой способ выполнения этой задачи.
Если мы можем предположить, что есть только одно совпадение, то альтернативой вашему конвейеру является использование ed и исключение ненужных cat и вторичного grep:
ed -s file <<\EOED | awk '/Database name/ {print $4}'
/Directory entry type.*Indirect/-4,//p
q
EOED
Если их несколько,неперекрывающиесясовпадения, для их маркировки можно использовать глобальную команду ed:
ed -s file <<\EOED | awk '/Database name/ {print $4}'
g/Directory entry type.*Indirect/-4,.p
q
EOED
Чтобы продемонстрировать случай перекрывающихся совпадений, предположим, что мы сопоставляем строку foo
и есть совпадения в строках 7 и 9, и мы извлекаем три предыдущие строки каждого совпадения в качестве контекста, вывод будет выглядеть следующим образом:
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
решение2
Я бы сделал это немного по-другому. Сначала выполните команду db2 LIST DB DIRECTORY
и сохраните ее вывод в текстовый файл. Таким образом, вам не придется запускать ее несколько раз. Затем для каждого из ваших целевых имен передайте имя в скрипт awk, который соберет соответствующие строки:
## 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
решение3
$ 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