awk 고정 텍스트부터 시작하여 첫 번째 빈 줄까지

awk 고정 텍스트부터 시작하여 첫 번째 빈 줄까지

빈 줄로 구분된 첫 번째 "단락" 또는 "섹션"만 반환하는 항목으로 파이프를 시도하고 있습니다. 다른 답변에 따라 범위를 사용 awk하거나 얻을 수 있다고 생각했지만 sed작동하지 않는 것 같습니다.

$ cat txt
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

$ cat txt |awk '/^Package:/,/^$/'
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

첫 번째 "섹션"만 반환하면 안 되나요? (기준: 고정된 텍스트부터 시작하여 첫 번째 빈 줄까지 Grep 그리고 https://www.unix.com/shell-programming-and-scripting/148692-awk-script-match-pattern-till-blank-line.html)

  • 빈 줄을 사용하면 grep -ve ^$제거되므로 특수 문자가 없습니다.
  • 다른 부분을 추출하려고 하면 두 "섹션" 모두에서 해당 부분을 가져옵니다.

    $ cat txt |awk '/^Package:/,/^Version:/'
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.9.1-0ubuntu0.1
    Package: plasma-desktop
    Architecture: amd64
    Version: 4:5.12.4-0ubuntu1
    
  • sed -n '/^Package:/,/^$/p'또는 를 사용하면 sed -n '/^Package:/,/^Version:/p'동등한 awk와 동일한 결과를 얻습니다.

첫 번째 발생 후 어떻게 받거나 awk중지 합니까?sed

답변1

이것이 바로 awk에 단락 모드가 있는 이유입니다:

$ awk -v RS= 'NR==1' file
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

NR==1두 번째 레코드를 인쇄하는 것은 다음과 같이 명백하게 변경된 것입니다 NR==2.

$ awk -v RS= 'NR==2' file
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.4-0ubuntu1
Supported: 3y

범위 표현식을 사용하지 마십시오. 사소한 문제에 대한 코드는 플래그를 사용하는 것보다 매우 약간 짧지만 요구 사항이 조금이라도 변경되면 완전히 다시 작성하거나 조건을 복제해야 합니다. 따라서 언제든지 /begin/,/end/sed 또는 awk와 함께 사용하고 싶을 때 /begin/{f=1} f{print} /end/{f=0}마다 awk를 사용하면 시작/끝 줄을 인쇄하는 시기/방법 등을 훨씬 더 효과적으로 제어할 수 있습니다.

답변2

에서 /begin/,/end/"작업 플래그"는 일치 항목이 발견될 때마다 켜지고 일치 항목이 발견 /begin/되면 꺼집니다 . /end/"시작"과 "끝"이 있는 경계선도 인쇄됩니다.

입력에 대한 결과는 다음과 같습니다(아래 샘플에서 인쇄된 줄 뒤에는 주석이 있습니다).

  • 와 함께 '/^Package:/,/^$/':
    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.9.1-0ubuntu0.1 #
    Supported: 3y                  #
                                   #TURN OFF
    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.4-0ubuntu1     #
    Supported: 3y                  #
  • 와 함께 '/^Package:/,/^Version:/':
    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.9.1-0ubuntu0.1 #TURN OFF
    Supported: 3y

    Package: plasma-desktop        #TURN ON
    Architecture: amd64            #
    Version: 4:5.12.4-0ubuntu1     #TURN OFF
    Supported: 3y

"Package:"로 시작하는 단락만 인쇄하려면 다음과 같이 쓸 수 있습니다.

sed -ne '/^$/q' -e '/^Package:/,$p' file

sed로 인해 빈 줄을 찾는 즉시 파일 처리를 종료합니다 /^$/q.

와 함께 awk:

awk '/^$/{exit};/^Package:/,0' file

답변3

댓글로콰지모도

/begin/,/end/경계선을 포함하여 해당 정규식과 일치하는 줄을 가져옵니다. Begin은 인쇄를 켜고 End는 끕니다. 빈 줄 바로 뒤의 줄이 인쇄를 다시 켭니다. Package:그 안에도 포함되어 있기 때문입니다.

나는 to를 사용 sed하고 변경할 수 있다는 것을 깨달았으며 처음부터 시작될 것입니다. 시작이 하나뿐이므로 한 번만 일치합니다./begin/0

$ cat txt |sed -n '0,/^$/p'
Package: plasma-desktop
Architecture: amd64
Version: 4:5.12.9.1-0ubuntu0.1
Supported: 3y

관련 정보