나는 GREP와 내가 필드를 사용할 수 있다는 것을 알고 -A
와 -B
경기에서 이전 및 다음 줄을 당깁니다.
그러나 그들은 많은 라인이 지정되어 있지만 일치하는 모든 라인을 가져옵니다.
grep -r -i -B 5 -A 5 "match"
난 단지 5를 수신 할 일 경기 전에 라인과 5 번째 일치하는 라인에 추가 경기 후 라인 사이의 라인을 얻을 수 없습니다.
이 작업을 수행하는 방법이 grep
있습니까?
나는 GREP와 내가 필드를 사용할 수 있다는 것을 알고 -A
와 -B
경기에서 이전 및 다음 줄을 당깁니다.
그러나 그들은 많은 라인이 지정되어 있지만 일치하는 모든 라인을 가져옵니다.
grep -r -i -B 5 -A 5 "match"
난 단지 5를 수신 할 일 경기 전에 라인과 5 번째 일치하는 라인에 추가 경기 후 라인 사이의 라인을 얻을 수 없습니다.
이 작업을 수행하는 방법이 grep
있습니까?
답변:
사용하려는 도구를 sift라고합니다. 이것은 기본적으로 스테로이드에 대한 grep입니다. 병행하십시오. Sift에는 원하는대로 정확하게 수행 할 수있는 다양한 옵션이 있습니다. 특히 특정 텍스트가 뒤에 오는 / 앞에 있지 않을 수있는 일치 항목과 관련하여 특정 줄을 반환합니다.
sift는 go 언어로 작성된 주류 gnu가 아니라 Linux에 잘 설치된다는 사실에 놀랍습니다. IT는 grep이 동일한 작업을 수행하는 데 몇 주가 걸리는 대량의 모든 텍스트를 사용하여 동시에 검색합니다.
만약:
cat file
a
b
c
d
e
f match
g
h
i match
j
k
l
m
n
o
그때:
awk '
{line[NR] = $0}
/match/ {matched[NR]}
END {
for (nr in matched)
for (n=nr-5; n<=nr+5; n+=5)
print line[n]
}
' file
a
f match
k
d
i match
n
/match/ {matched[NR]}
있습니까? 배열이나 변수를 전체 명령으로 본 적이 없습니다. 일치하는 각 줄의 현재 레코드 번호를 배열에 넣습니까?
key in array
. 내가하고있는 일은 패턴이 나타나는 줄 번호를 기억하는 것입니다
으로 만 할 수는 없습니다 grep
. 경우 ed
'옵션은 S :
ed -s file << 'EOF'
g/match/-5p\
+5p\
+5p
EOF
스크립트는 기본적으로 / match /와 일치 할 때마다 그 앞에 5 줄, 그 후에 5 줄, 그 뒤에 5 줄을 인쇄합니다.
ed
이다 항상 있기 때문에, 대답 ed
표준 텍스트 편집기입니다.
grep
대답은 아니지만 "X로 할 수는 없지만 Y로 할 수 있습니다"라는 대답은 OP의 질문에 대답 할뿐만 아니라 대안을 제공하기 때문에 여전히 유효한 대답입니다. 작동합니다. 올바른 답변 유형입니다.
awk '/match/{system("sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME)}' infile
여기에 우리가 사용하는 AWK를 의 외부 호출하는 기능을 선 인쇄 명령을 AWK 패턴과 일치 5 일 개 이전과 경기 후 라인.system(command)
sed
match
구문은 간단합니다. 외부 명령 자체를 큰 따옴표와 스위치 안에 넣고 스위치에 정확하게 전달하려는 항목을 이스케이프하면 awk
자체 옵션 과 관련된 모든 항목 이 따옴표 외부에 있어야합니다. 그래서 아래의 sed :
"sed -n \"" NR-5 "p;" NR "p;" NR+5 "p\" " FILENAME
로 번역 :
sed -n "NR-5p; NRp; NR+5p" FILENAME
NR
패턴 match
과 일치하는 행 번호 이며을 통과하는 FILENAME
현재 처리중인 파일 이름awk
입니다.
@glenn의 예제 텍스트 파일을 사용하고 awk 대신 perl을 사용하십시오.
$ perl -n0E 'say /(.*\n)(?=(?:.*\n){4}(.*match.*\n)(?:.*\n){4}(.*\n))/g' ex
동일한 결과를 제공하지만 더 빠르게 실행됩니다.
a
f match
k
d
i match
n
grep -r -i -B 5 -A 5 "match" | sed -e 1b -e '$!d'