여기마지막 일치 항목 이후의 모든 행을 인쇄하는 링크입니다.
그러나 마지막 일치 항목 이후 두 줄만 인쇄하고 싶습니다. 어떻게 해야 하나요?
답변1
당신이 사용할 수있는 ed
:
printf '%s\n' '?pattern?+1, ?pattern?+2 p' | ed -s file
ed
이는 stdin에 명령을 보냅니다. 이 -s
플래그는 파일을 읽을 때 바이트 수의 출력을 억제합니다. 명령은 다음과 같이 분류됩니다.
... , ... p
-- 주어진 (..., ...) 주소 범위 내의 행을 인쇄합니다.?pattern?+1
-- 뒤로 검색하여pattern
하나 추가?pattern?+2
-- 뒤로 검색하여pattern
2개 추가
pattern
현재 기본값은 파일의 마지막 줄이므로 이러한 검색은 파일에서 마지막 항목을 찾습니다 . 그런 다음 오프셋은 다음 두 줄을 선택합니다.
답변2
GNU를 사용 grep
하고tail
αГsнιmet용 샘플 파일:
$ cat file
====
1
2
3
4
====
11
22
33
====
111
222
333
444
====
1111
2222
3333
$ grep -A2 "====" file | tail -n2
1111
2222
일치하는 줄(이 경우 검색 -A2
중인 줄 )과 그 뒤의 두 줄을 인쇄하도록 지시합니다. 그러면 마지막 두 줄만 인쇄됩니다.grep
====
tail -n2
파일이 매우 큰 경우 tac
파일 끝부터 읽고 논리를 반대로 하면 작업 속도를 높일 수 있습니다.
$ tac file | grep -m1 -B2 "====" | tac |tail -n2
1111
2222
답변3
sed
두 줄을 원한다고 가정하고 사용 하십시오.뒤쪽에마지막 일치 (그리고 각 일치 줄이 다른 일치 줄로부터 최소 두 줄 이상 떨어져 있다고 pattern
가정 ):pattern
$ cat file
a
b pattern
c the 1st
d the 2nd
e the 3rd
1
2
3 pattern
4 the first
5 the second
6 the third
7
$ sed -n -e '/pattern/ { n; N; h; }' -e '$ { g; /./p; }' file
4 the first
5 the second
일치하는 항목이 있으면 sed
명령은 다음 줄을 읽습니다. 후속 행은 버퍼에 추가되고 두 행 모두 예약된 공간에 복사됩니다(이전에 저장된 내용을 덮어씁니다).n
pattern
N
h
마지막 행에 도달하면 예약된 공간을 얻습니다. 이 공간은 이제 행 일치 후 최신 두 행을 포함하거나 pattern
일치하는 항목이 없으면 비어 있습니다. pattern
버퍼가 비어 있지 않으면 출력합니다.
얻기 위해서는삼줄 뒤의 줄을 일치시키려면 대신 를 pattern
사용하십시오 .n; N; N; h;
n; N; h;
행 일치 후 세 행을 가져옵니다 pattern
(이제 일치하는 행이 최소 세 행 이상 떨어져 있다고 가정).
$ sed -n -e '/pattern/ { n; N; N; h; }' -e '$ { g; /./p; }' file
4 the first
5 the second
6 the third
pattern
멀리 떨어진 줄을 일치시킬 필요가 없도록 하려면 우리가 읽은 "나중 줄"이 일치하는지 확인 pattern
하고 일치한다면 거기서부터 다시 시작해야 합니다.
sed -n -e ':a' -e '/pattern/ { n; /pattern/ba; N; /pattern/ba; h; }' -e '$ { x; /./p; }' file
답변4
GNU sed확장 정규식 모드에서는 -E
쉘 변수를 보려는 행 수로 변경하십시오.
n=2
sed -Ee '
/\n/q
/pattern/{
:loop
$d;N
/(.*\n){'"$n"'}/!bloop
x
}
$!d;x
/\n.*\n/D
s/.*\n//p;d
' file
- 패턴 라인을 찾은 후 루프를 설정하여 패턴 공간에 라인을 축적합니다.
- 패턴라인 이후 n번째 라인이 보이면 정지합니다. (패턴라인 제외)
- 이 n+1개 행을 보류 상태로 저장하고 eof에 도달하지 않으면 가능한 다음 패턴에 대한 검색을 다시 시작합니다.
- 마지막으로 eof에서 예약된 공간 데이터가 검색되고 첫 번째 행(모델 행)이 제거됩니다.