echoer
많은 정보를 스크리닝하기 위해 인쇄 하는 스크립트가 있습니다 . 패턴을 찾은 후에 만 선을 볼 수 있기를 원합니다.
솔루션의 사용법이 다음과 같이 보인다고 상상합니다.
echoer | solution_command <pattern>
이상적으로 pattern
는 정규 표현식이지만 하드 값 문자열이면 충분합니다.
echoer
많은 정보를 스크리닝하기 위해 인쇄 하는 스크립트가 있습니다 . 패턴을 찾은 후에 만 선을 볼 수 있기를 원합니다.
솔루션의 사용법이 다음과 같이 보인다고 상상합니다.
echoer | solution_command <pattern>
이상적으로 pattern
는 정규 표현식이지만 하드 값 문자열이면 충분합니다.
답변:
AWK는 패턴 범위를 사용하여이 작업을 수행 할 수 있으므로 정규식을 사용할 수 있습니다.
echoer | awk '/pattern/,0'
echoer
첫 줄 일치로 시작하여 출력 을 인쇄 pattern
합니다.
AWK는 패턴 기반이며 일반적으로 "이 패턴이 일치하면이 작업을 수행하십시오"유형의 접근 방식과 함께 사용됩니다. "이 패턴"은 "이 패턴이 일치 할 때이 패턴이 일치 할 때까지이 패턴을 시작할 때"로 정의 된 다양한 패턴 일 수 있습니다. 위와 같이 쉼표로 구분 된 두 패턴을 작성하여 지정합니다. 패턴은 /pattern/
현재 행이 패턴과 비교되어 일반 표현식으로 해석되는 것처럼 텍스트 일치 일 수 있습니다 . 또한 일반 표현식 일 수 있으며 모든 행에 대해 평가되며 결과가 0이 아니거나 비어 있지 않은 경우 일치하는 것으로 간주됩니다.
AWK에서 기본 조치는 현재 행을 인쇄하는 것입니다.
이 모든 것을 합치면 awk '/pattern/,0'
일치하는 행 pattern
을 찾고 일단 발견되면 0
조건이 일치 할 때까지 (0이 아닌) 모든 행에 기본 조치를 적용합니다 . awk '/pattern/,""'
작동합니다.
GAWK 설명서는 훨씬 더 세부로 들어갑니다.
0
합니까? 그럴까요 /pattern/,/0/
? 대답은 기본 동작을 명시 적으로 작성하는 것 같습니다.
/pattern/,/0/
“0”을 포함하는 행 (레코드)을 찾을 때까지 인쇄합니다. 명시 적 작업과 대답의 조각을 작성하는 것은 제공 /pattern/,0 { print $0 }
, 또는 동등 /pattern/,0 { print }
.
sed
@StephenKitt의 필수 항목은 다음 과 같습니다 awk
.
sed '/pattern/,$!d'
pattern
A와이 해석됩니다 기본 정규 표현식 처럼 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'
awk
첫 번째 패턴 일치 이후 (그러나 포함하지는 않음) 줄의 경우트리거 패턴을 포함하는 라인이 "CUT HERE"와 동일하면 인쇄 된 출력에서 생략 할 수 있습니다.
echoer | awk 'flag ; /pattern/ { flag=1 }'
각 입력 줄은 awk 코드에서 두 가지 구성 요소를 통해 실행됩니다. 첫 번째 구성 요소는 flag
입니다. awk는 "변수가flag
가 0이 아닌 . awk 변수는 기본적으로 0이므로 처음에는 아무 것도 인쇄하지 않습니다.
두 번째 구성 요소 인 /pattern/ { flag=1 }
은 패턴을 감지하자마자 플래그를 1로 설정하고 플래그는 나머지 실행 동안 해당 값을 유지합니다.
패턴이 처음 감지 될 때까지 해당 입력 라인을 인쇄 할 기회가 지났습니다. 모든 후속 줄 (패턴을 포함하는 추가 줄 포함)이 인쇄됩니다.
약간 어색하지만 작동합니다.
#!/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