Во-первых, нет причин, по которым grep
нельзя это сделать. Да, и обратите внимание, что cat
вам не нужен, как grep
, так и awk
могут принимать имена входных файлов:
$ grep -xB2 'create table "sacro".issue' file
{ unload file name = issue00106.unl number of rows = 74 }
create table "sacro".issue
Итак, если вам нужна только первая строка, сделайте:
$ grep -xB2 'create table "sacro".issue' file | head -n1
{ unload file name = issue00106.unl number of rows = 74 }
-x
означает «совпадение со всей строкой», что гарантирует, что строка create table "sacro".issue_category
не будет напечатана. -B2
означает «распечатать также 2 предыдущие строки».
Вы также можете сделать это в awk
по запросу:
$ awk -vs='create table "sacro".issue' '($0==s){print b2}{b2=b1; b1=$0}' file
{ unload file name = issue00106.unl number of rows = 74 }
Что заставляет вас думать, что $@
будет хранить что-либо после того, как вы используете read
для чтения в cur
? Поскольку вы снова читаете его в цикле, результат зависит от того, с какими аргументами вы запускаете этот скрипт, поскольку это то, что означает $@
.