다른 특정 경기까지 각 그렙 경기 후 줄을 표시하는 방법은 무엇입니까?


44

"-A NUM"스위치 를 사용하면 각 일치 후 특정 수의 후행 줄을 인쇄 할 수 있다는 것을 알고 있습니다. 각 일치 후에 특정 단어를 찾을 때까지 후행을 인쇄 할 수 있는지 궁금합니다. 예를 들어 "Word A"를 검색 할 때 "Word A"가 포함 된 줄과 "Word D"가 포함 된 줄까지 그 다음 줄을보고 싶습니다.

문맥:

Word A
Word B
Word C
Word D
Word E
Word F

명령:

grep -A10 'Word A'

이 출력이 필요합니다.

Word A
Word B
Word C
Word D

답변:


73

' Word A'와 ' Word D'(포함) 사이에 줄을 인쇄하려는 것 같습니다 . sed대신에 사용 하는 것이 좋습니다 grep. 원하는 패턴으로 시작하고 끝나는 입력 스트림 범위를 편집 할 수 있습니다. sed범위 내의 모든 줄을 인쇄하고 다른 줄은 인쇄하지 말라고 지시 해야 합니다.

sed -n -e '/Word A/,/Word D/ p' file

독점적 인 방법 (OP뿐만 아니라 일반적인 상황)에 대한 팁이 있습니까?
2rs2ts

4
@ 2rs2ts는 전용 단지 추가로 만들려면 | sed -e '1d;$d'먼저 제거하고 마지막 줄입니다,
holroy

그리고 두 줄 사이의 모든 줄을 제외하고 싶다면, 즉 두 개의 일치 항목 이외의 줄을보고 싶을 것입니다. sed -n -e '/pattern A/,/pattern D/d; p'"패턴 A에서 패턴 D로 삭제하고 다른 모든 것을 인쇄합니다"라고 말합니다. 불행히도이 경기는 욕심이 많습니다. 즉, 패턴 A와 D가 두 번 이상 나타나면 첫 번째 패턴 A에서 마지막 패턴 D 까지 일치하게됩니다. 펄이나 파이썬이 당신의 친구라면 두렵습니다.
fbicknel

16

왜 awk를 사용하지 않습니까?

awk '/Word A/,/Word D/' filename

2
sed는 많은 수의 파일이 관련된 경우 훨씬 효율적으로 수행 할 수 있습니다. awk는 기억하기 쉬울 수 있지만, sed는 내 두뇌에 스티커 메모 가치가있는 것 같습니다.
JimNim

1
awk는와 Word D같은 줄에 있을 경우 우수 Word A하며 다른 곳에서 가능합니다. 예 Word A Word D\nWord D를 들어 sed를 사용하면 awk가 하나를 표시하는 두 줄을 표시합니다. 또한 awk와 함께 변수를 계속 사용할 수 있습니다. 예를 들어 awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file", sed는 더 효율적일 수 있지만 같은 줄에 있거나 없을 수있는 두 개의 문자열 검색을 처리 할 때 awk가 더 안정적입니다.
S0AndS0

그것은 그 AWK 더 나은 것 같다 파일의 시퀀스를 포함하는 경우를 처리 A하고 B당신은 각 등의 순서 사이에 무엇을 캡처 할. 내 경우에는 sed가 이러한 의미를 따르지 않는 것 같습니다.
Matan

9
perl -lne 'print if /Word A/ .. /Word D/' file

또는

cat file | perl -lne 'print if /Word A/ .. /Word D/'

1
드라이브 바이 다운 보트를 카운터하려면 +1 sed구분선을 선택하기 위해 Perl 정규 표현식의 힘이 필요하지 않은 한 여전히 이것을 사용 합니다.
tripleee

70 년대에 sed를 쓴 사람들은 감사해야합니다 :-)
Matan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.