경기의 주변 캐릭터를 grep


8

거대한 데이터베이스 덤프 내에서 찾기 및 바꾸기를 시도하고 있는데 생각해야 할 일을하지 않습니다. 파일에서 대상 문자열을 grep하고 주변 8 문자 정도를 확인하고 싶습니다 (필요에 따라 해당 숫자를 조정해야 할 수도 있음). 어떻게해야합니까?

내가 안구를 볼 수없는 이유는 수천 개가 아니라도 수백 개가 있기 때문입니다. 문자열을 둘러싼 몇 개의 문자를 가져 uniq와서 찾기 및 바꾸기가 예기치 않은 동작을하는 이유를 알기 위해 또는 다른 것으로 파이프하고 싶습니다.

또한 같은 줄에 여러 개의 일치 항목이있을 수 있습니다!


텍스트 파일이 아닙니까?
enzotib

그것은, 그러나 단지 시합이 너무 커서 안구 파일입니다.
user394

답변:


12

사용하는 원유 방법 grep은 다음과 같습니다.

grep -o "....yourtext...." /path/to/the/dump.sql

도트 수는 자른 텍스트 앞 / 뒤의 문자 수에 해당합니다. 이 -o옵션을 사용 grep하면 전체 행이 아닌 일치 항목 만 출력합니다.

uniq출력에서 사용하려면 먼저 출력을 정렬해야합니다. 따라서 일반적으로

grep . . . | sort | uniq

각 경기의 적중 횟수에 관심이 있다면 다음을 사용하여 좋은 결과를 얻을 수 있습니다

grep . . . | sort | uniq -c | sort -n

조잡한? 완전히 정교합니다!
user394

1
반복 연산자를 사용하여 조금 더 확장 할 수 grep -o '.\{8\}yourtext.\{8\}'있습니다. 이것은 8 도트를 계산하는 것보다 약간 현기증입니다.
Caleb

:) 조잡하다는 것은 일치하는 문자 수 (범위 사용) 또는 문자 집합 축소와 같은 것을 사용하지 않음을 의미합니다.
rozcietrzewiacz

@ Caleb 및 user394 : 이것은 내가 제안하지 않았던 정확한 것입니다 (따라서 내 방법을 "원유"라고 함). 반복 연산자 구문을 기억할 필요는 없습니다. ".. {{6 \}"보다 "....."를 입력하는 것이 훨씬 빠릅니다.
rozcietrzewiacz

7

@rozcietrzewiacz의 답변에서 시작하여

pattern="string"
num=8
grep -on ".\{0,$num\}$pattern.\{0,$num\}" input-file

1
"조잡한"도트 시퀀스는 항상 더 나아지고 있습니다 :)
Caleb

1
@Caleb : 일반적으로 "조잡한 (crude)"대답은 좋은 출발이지만 때로는 약간의 설명을 원할 수도 있습니다.
enzotib

1
도트 시퀀스 방법은 왼쪽 또는 오른쪽 정렬 된 대상 패턴을 찾지 않습니다. 이 방법은 것입니다. (+1)
Peter.O

2
추신. 방금 첫 번째 패턴의 후행 'exta'텍스트의 범위가 선행 'extra'텍스트의 범위와 겹칠 때 동일한 행에서 (여기에서 언급 한 OP와 같이) 여러 패턴 인스턴스를 포착하지 않는다는 것을 알았습니다. 다음 패턴
Peter.O

@fred : 네, -o두 경기가 겹칠 때 첫 경기 echo 'aaabbbccc' | grep -o 'bb
만합니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.