Установка Rust вручную, похоже, устранила проблему:
curl https://sh.rustup.rs -sSf | sh
Я бы сделал это немного по-другому. Сначала выполните команду 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
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