AWK를 사용하여 특정 줄의 콘텐츠를 인쇄하는 방법

AWK를 사용하여 특정 줄의 콘텐츠를 인쇄하는 방법

문자열 "clientside"가 "n" 줄에서 발견되면 "n-1" 줄의 내용이 인쇄되어야 합니다.

/Partition/SSL_profile예를 들어, 13행에서 문자열을 찾으면 12행의 내용을 인쇄하고 싶습니다 .clientside

12: /Partition/SSL_profile
13:       context clientside

답변1

사용 awk:

clientside그러면 일치하는 이전 레코드가 인쇄됩니다. 두 번째 명령은 레코드 번호와 이전 레코드를 인쇄합니다.

awk '/clientside/{ print prev;};{prev=$0}' file
awk '/clientside/{ printf "%s: %s\n", (NR-1), prev};{prev=$0}' file

이는 현재 입력 레코드( )뿐만 아니라 이전 레코드도 인쇄합니다 $0.

awk '/clientside/{ print prev; print $0};{prev=$0}' file
awk '/clientside/{ printf "%s: %s\n%s: %s\n", (NR-1), prev,NR,$0};{prev=$0}' file

clientside일치하는 경우 변수에 저장된 이전 레코드를 인쇄한 prev후 현재 입력 레코드( $0)를 인쇄합니다.

하지만 이 명령은 중복된 줄을 인쇄합니다.

$ cat file
/Partition/SSL_profile
context1 clientside 
context2 clientside
context3 clientside

위 명령은 다음과 같은 출력을 제공합니다.

awk '/clientside/{ print prev; print $0};{prev=$0}' file
/Partition/SSL_profile
context1 clientside 
context1 clientside 
context2 clientside
context2 clientside
context3 clientside

따라서 중복된 줄을 피하기 위해 명령을 이것으로 변경해야 합니다.

 awk '/clientside/{ if(line!=prev_lineno) print prev; print $0; line=NR};
{prev=$0;prev_lineno=NR}' file

답변2

인쇄둘 다행(위의 행과 발견된 문자열)

grep -B1 clientside file

어디

  • -B1은 처음 1줄을 나타내고, -B5를 사용하여 처음 5줄을 인쇄합니다.

이전 줄만 인쇄합니다(문자열 clientside이 두 번 나타나더라도 문자열이 하나만 있는 것은 아닙니다).

grep -B1 clientside file | head -1

grep모든 모양에 대해 역방향 grep을 사용하여 행 합계와 일치하는 그룹 구분 기호를 제거합니다 .

grep -B1 'clientside' file | grep -v '^--$\|clientside'

답변3

사용 awk:

$ awk '/clientside/ {if (a && a !~ /clientside/) print a} {a=$0}' file
/Partition/SSL_profile

사용 sed:

$ sed -n -e '/clientside/ {x;p;d;}' -e x file 
/Partition/SSL_profile

또는 POSIX적으로:

$ sed -n '/clientside/{g
1!p
}
h
' file
/Partition/SSL_profile

관련 정보