![유일한 줄을 깨우고 위의 2줄을 인쇄하는 방법](https://linux55.com/image/110738/%EC%9C%A0%EC%9D%BC%ED%95%9C%20%EC%A4%84%EC%9D%84%20%EA%B9%A8%EC%9A%B0%EA%B3%A0%20%EC%9C%84%EC%9D%98%202%EC%A4%84%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
awk를 사용하여 줄을 찾고 그 위에 두 줄을 인쇄하는 데 문제가 있습니다.
파일 test.txt 파일은 다음과 같습니다”
{ TABLE "sacro".issue row size = 149 number of columns = 9 index size = 0 }
{ unload file name = issue00106.unl number of rows = 74 }
create table "sacro".issue
(
issue_no serial not null constraint "sacro".nnc_issue00,
user_logged varchar(8,1) not null constraint "sacro".nnc_issue01,
issue_status_code integer not null constraint "sacro".nnc_issue02,
issue_cat_code varchar(2) not null constraint "sacro".nnc_issue03,
issue_descr text not null constraint "sacro".nnc_issue04,
issue_feedback text,
user_action varchar(8,1),
date_logged date not null constraint "sacro".nnc_issue05,
date_compl date
);
revoke all on "sacro".issue from "public" as "sacro";
{ TABLE "sacro".issue_category row size = 104 number of columns = 2 index size = 8 }
{ unload file name = issue00107.unl number of rows = 5 }
create table "sacro".issue_category
(
issue_cat_code varchar(2) not null constraint "sacro".nnc_iss_cat00,
issue_cat_descr varchar(100),
primary key (issue_cat_code) constraint "sacro".pkc_issuecategory
);
revoke all on "sacro".issue_category from "public" as "sacro";
{ TABLE "sacro".issue row size = 149 number of columns = 9 index size = 0 }
{ unload file name = issue00106.unl number of rows = 74 }
제가 찾고 있는 라인은 다음과 같습니다.
create table "sacro".issue
내가 실행하는 명령은 다음과 같습니다.
cat test.txt | awk '{a[NR]=$0} $0~s {f=NR} END {for (i=f-B;i<=f+A;i++) print a[i]}' B=2 A=0 s='create table \"sacro\".issue'
명령을 실행하면 create table "sacro".issue_category 줄을 찾습니다. grep -w를 사용하는 것처럼 필요한 줄을 찾기 위해 grep을 수행하는 방법이 있습니까? 불행하게도 다음 grep 명령은 HPUX에서 작동하지 않습니다.
cat test.txt | grep -B 2 -w "create table \"sacro\".issue" | head -1
내가 원하는 결과는 다음과 같습니다(헤더-1 사용).
{ unload file name = issue00106.unl number of rows = 74 }
답변1
sed -e '
1N # get 2nd line in pattern space
$!N # get 3rd line in pattern space
/\ncreate table "sacro"\.issue$/P # if the last portion of matches, show 1st portion
D # strip 1st portion & reapply sed code on what
# remains of the pattern space
' test.txt
grep -B 2 'create table "sacro"\.issue$' test.txt | sed q
답변2
우선, 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
"처음 두 줄을 동시에 인쇄합니다.
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 }