패턴을 찾은 후에 만 ​​인쇄 출력


13

echoer많은 정보를 스크리닝하기 위해 인쇄 하는 스크립트가 있습니다 . 패턴을 찾은 후에 만 ​​선을 볼 수 있기를 원합니다.

솔루션의 사용법이 다음과 같이 보인다고 상상합니다.

echoer | solution_command <pattern>

이상적으로 pattern는 정규 표현식이지만 하드 값 문자열이면 충분합니다.


따라서 패턴은 여러 문자열이 될 수 있습니까?
Inian

글로브? 정규식을 의미합니까? 글롭은 파일 이름 확장에만 의미가 있습니다.
terdon

@Inian 나는 그 질문을 이해하지 못한다. 이것이 분리와 함께 작동하도록 하시겠습니까?
23146

답변:


21

AWK는 패턴 범위를 사용하여이 작업을 수행 할 수 있으므로 정규식을 사용할 수 있습니다.

echoer | awk '/pattern/,0'

echoer첫 줄 일치로 시작하여 출력 을 인쇄 pattern합니다.

AWK는 패턴 기반이며 일반적으로 "이 패턴이 일치하면이 작업을 수행하십시오"유형의 접근 방식과 함께 사용됩니다. "이 패턴"은 "이 패턴이 일치 할 때이 패턴이 일치 할 때까지이 패턴을 시작할 때"로 정의 된 다양한 패턴 일 수 있습니다. 위와 같이 쉼표로 구분 된 두 패턴을 작성하여 지정합니다. 패턴은 /pattern/현재 행이 패턴과 비교되어 일반 표현식으로 해석되는 것처럼 텍스트 일치 일 수 있습니다 . 또한 일반 표현식 일 수 있으며 모든 행에 대해 평가되며 결과가 0이 아니거나 비어 있지 않은 경우 일치하는 것으로 간주됩니다.

AWK에서 기본 조치는 현재 행을 인쇄하는 것입니다.

이 모든 것을 합치면 awk '/pattern/,0'일치하는 행 pattern을 찾고 일단 발견되면 0조건이 일치 할 때까지 (0이 아닌) 모든 행에 기본 조치를 적용합니다 . awk '/pattern/,""'작동합니다.

GAWK 설명서는 훨씬 더 세부로 들어갑니다.


3
범위의 끝이 0 인 범위 의미론을 알지 못했습니다. 감사!
Kusalananda

@StephenKitt 이것은 대단하다! 일치 할 때까지 인쇄하려면 어떻게해야 0합니까? 그럴까요 /pattern/,/0/? 대답은 기본 동작을 명시 적으로 작성하는 것 같습니다.
23146

@ user23146 예, /pattern/,/0/“0”을 포함하는 행 (레코드)을 찾을 때까지 인쇄합니다. 명시 적 작업과 대답의 조각을 작성하는 것은 제공 /pattern/,0 { print $0 }, 또는 동등 /pattern/,0 { print }.
Stephen Kitt

7

sed@StephenKitt의 필수 항목은 다음 과 같습니다 awk.

sed '/pattern/,$!d'

patternA와이 해석됩니다 기본 정규 표현식 처럼 grep(반대로 확장 정규 표현식awk/ egrep/ grep -E). 일부 sed구현에는 확장 정규 표현식 으로 만들기 위한 -E(BSD, ast, 최근 GNU / busybox, 곧 POSIX) 또는 -r(GNU, ssed, busybox, 최근 BSD) 옵션이 있습니다. 대신하고 일부는 -P(스트) 또는 -R(ssed) 펄과 같은 정규 표현식.

perl:

perl -ne 'print if /pattern/ .. undef'

4

GNU와 * BSD grep으로 :

grep -A1000000000 pattern file

파일에 1M 줄 이상이 없으면 그게 다입니다.


0

less명령의 출력을 보는 것과 같은 호출기를 사용하는 경우

less +pattern

0

awk 첫 번째 패턴 일치 이후 (그러나 포함하지는 않음) 줄의 경우

트리거 패턴을 포함하는 라인이 "CUT HERE"와 동일하면 인쇄 된 출력에서 ​​생략 할 수 있습니다.

echoer | awk 'flag ; /pattern/ { flag=1 }'

각 입력 줄은 awk 코드에서 두 가지 구성 요소를 통해 실행됩니다. 첫 번째 구성 요소는 flag입니다. awk는 "변수가flag 가 0이 아닌 . awk 변수는 기본적으로 0이므로 처음에는 아무 것도 인쇄하지 않습니다.

두 번째 구성 요소 인 /pattern/ { flag=1 }은 패턴을 감지하자마자 플래그를 1로 설정하고 플래그는 나머지 실행 동안 해당 값을 유지합니다.

패턴이 처음 감지 될 때까지 해당 입력 라인을 인쇄 할 기회가 지났습니다. 모든 후속 줄 (패턴을 포함하는 추가 줄 포함)이 인쇄됩니다.


0

세게 때리다

약간 어색하지만 작동합니다.

#!/bin/bash
found=false
while IFS= read -r; do
    if $found || [[ $REPLY =~ pattern ]]; then
        found=true
        printf '%s\n' "$REPLY"
    fi
done

이 버전은에 의존 cat하지만 이해하기 쉽습니다.

#!/bin/bash
while IFS= read -r; do
    if [[ $REPLY =~ pattern ]]; then
        printf '%s\n' "$REPLY"
        break
    fi
done
cat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.