문자열 "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