아래는 파일의 텍스트입니다.
Pseudo name=Apple
Code=42B
state=fault
Pseudo name=Prance
Code=43B
state=good
"42B"를 grep하고 위와 같은 텍스트를 다음과 같이 출력해야합니다.
Pseudo name=Apple
Code=42B
state=fault
누구나 grep
/ awk
/ 사용하여 이것을 달성하는 방법에 대한 아이디어가 sed
있습니까?
아래는 파일의 텍스트입니다.
Pseudo name=Apple
Code=42B
state=fault
Pseudo name=Prance
Code=43B
state=good
"42B"를 grep하고 위와 같은 텍스트를 다음과 같이 출력해야합니다.
Pseudo name=Apple
Code=42B
state=fault
누구나 grep
/ awk
/ 사용하여 이것을 달성하는 방법에 대한 아이디어가 sed
있습니까?
답변:
와 awk
awk -v RS='' '/42B/' file
RS=
입력 레코드 구분 기호를 줄 바꿈에서 빈 줄로 변경합니다. 레코드의 필드가 포함 된 경우 레코드를 /42B/
인쇄하십시오.
''
(null 문자열)은 POSIX에 따라 빈 줄을 나타내는 데 사용되는 마술 값입니다 .
경우 RS는 널 후 기록이 이루어진 시퀀스에 의해 분리되는
<newline>
선행 또는 공백 라인 입력의 시작 또는 끝 부분에 빈 레코드가 생성되지한다 후단 플러스 하나 이상의 공백 라인, 및이<newline>
항상 필드 분리되어야한다 FS 의 가치가 무엇이든간에 .
출력 구분 기호는 단일 줄 바꿈으로 유지되므로 출력 단락이 분리되지 않습니다. 출력 단락 사이에 빈 줄이 있도록하려면 출력 레코드 구분 기호를 두 줄 바꿈으로 설정하십시오.
awk -v RS='' -v ORS='\n\n' '/42B/' file
FILENAME
) 내의 파일 이름에 액세스 해야하는 경우가 아니라면 파일 이름을 포함 =
하거나 시작하는 -
(또는 -
) 인 파일 이름의 문제를 피하고 일관된 오류 메시지를 만들고 실행 awk
또는 수행 을 피하므로 리디렉션을 사용하는 것은 좋지 않습니다 입력 파일을 열 수없는 경우 다른 리디렉션
데이터가 항상 그 이전과 이후의 행이되도록 구성되어 있다고 가정하면 grep의 -A
(after) 및 -B
(before) 스위치를 사용하여 일치 전 1 행과 그 이후 1 행을 포함하도록 지시 할 수 있습니다.
$ grep -A 1 -B 1 "42B" sample.txt
Pseudo name=Apple
Code=42B
state=fault
검색어 앞뒤에 같은 숫자 줄을 원하면 -C
(컨텍스트) 스위치를 사용할 수 있습니다 .
$ grep -C 1 "42B" sample.txt
Pseudo name=Apple
Code=42B
state=fault
여러 줄을 일치시킬 때 더 엄격하려면 도구를 사용하여 pcregrep
여러 줄의 패턴을 일치 시킬 수 있습니다 .
$ pcregrep -M 'Pseudo.*\n.*42B.*\nstate.*' sample.txt
Pseudo name=Apple
Code=42B
state=fault
위 패턴은 다음과 일치합니다.
-M
-여러 줄'Pseudo.*\n.*42B.*\nstate.*'
-첫 번째 문자열이 단어로 시작하고 "Pseudo"
줄 끝까지 \n
문자가오고, 문자열 "42B"
이 나올 때까지 문자가오고, 다른 줄 끝 ( \n
)이 나올 때까지 문자가 오는 문자열 그룹 과 일치 합니다. "state"
뒤에 모든 문자가옵니다.-C
(문맥) 바로 가기로서 이용 될 수있는 경우 -A
와 -B
동일하다.
awk로 비슷하게 쉬운 방법이 있지만 펄에서는 :
cat file | perl -ne 'BEGIN { $/="\n\n" }; print if $_ =~ /42B/;'
기본적으로 파일을 빈 줄로 구분 된 청크로 분할 한 다음 정규식과 일치하는 청크 만 인쇄합니다.
빈 줄이없는 다른 펄 솔루션 :
perl -00ne 'if ($_ =~ /42B/) {chomp($_); printf "%s\n",$_}' foo
예
% perl -00ne 'if ($_ =~ /42B/) {chomp($_); printf "%s\n",$_}' foo
Pseudo name=Apple
Code=42B
state=fault
% cat foo
Pseudo name=Apple
Code=42B
state=fault
Pseudo name=Prance
Code=43B
state=good
perl -00 -ne 'print if /42B/' file
.