sed 스크립트는 마지막 일치 항목 이후 n 줄을 인쇄합니다.

sed 스크립트는 마지막 일치 항목 이후 n 줄을 인쇄합니다.

여기마지막 일치 항목 이후의 모든 행을 인쇄하는 링크입니다.

그러나 마지막 일치 항목 이후 두 줄만 인쇄하고 싶습니다. 어떻게 해야 하나요?

답변1

당신이 사용할 수있는 ed:

printf '%s\n' '?pattern?+1, ?pattern?+2 p' | ed -s file

ed이는 stdin에 명령을 보냅니다. 이 -s플래그는 파일을 읽을 때 바이트 수의 출력을 억제합니다. 명령은 다음과 같이 분류됩니다.

  • ... , ... p-- 주어진 (..., ...) 주소 범위 내의 행을 인쇄합니다.
  • ?pattern?+1-- 뒤로 검색하여 pattern하나 추가
  • ?pattern?+2-- 뒤로 검색하여 pattern2개 추가

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명령은 다음 줄을 읽습니다. 후속 행은 버퍼에 추가되고 두 ​​행 모두 예약된 공간에 복사됩니다(이전에 저장된 내용을 덮어씁니다).npatternNh

마지막 행에 도달하면 예약된 공간을 얻습니다. 이 공간은 이제 행 일치 후 최신 두 행을 포함하거나 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에서 예약된 공간 데이터가 검색되고 첫 번째 행(모델 행)이 제거됩니다.

관련 정보