Grep -o 또는 Sed/Awk를 사용하여 문자열 중간에서 조각을 가져옵니다.

Grep -o 또는 Sed/Awk를 사용하여 문자열 중간에서 조각을 가져옵니다.

로그 트래픽을 관찰하고 있는데 다양한 이미지 검색 엔진(특히 Bing)이 자주 남용되고 있는 것을 확인했습니다.

예시 URL:

http://www.bing.com/images/search?q=dagger+genesis+solo&view=detailv2&&&id=C65E811DFE01FB11258D2EB4F516F3DD8F09049C&selectedIndex=4&ccid=ffC0NVO8&simid=608046582336849763&thid=JN.XnLfF7qiZGwjJzTCR6f7ZQ&mode=overlay

"Dagger Origins Solo"라는 검색 자체를 꺼내고 싶습니다.

저 할 수 있어요

grep -o '=*' 

그러나 검색 뒤에는 = 기호와 모든 내용이 남습니다.

"search?q="와 마지막 단어 끝의 첫 번째 "&"(앞에 "+") 사이의 모든 내용을 파악하고 싶습니다.

awk 또는 cut을 사용하여 가능한 한 많은 문자열을 제거한 다음 지정된 필드 구분 기호를 사용하여 각 단어를 자체 열에 넣은 다음 해당 열을 인쇄하기 위해 매우 길고 복잡한 방법으로 도달할 수 있습니다. 그러나 이 방법도 일관성이 없습니다. 검색 길이에 제한이 없고 거의 모든 문자를 포함할 수 있기 때문입니다.

더 쉬운 방법이 있다고 생각합니다. 아이디어가 있나요?

나의 궁극적인 목표는 검색어를 제거하고 이를 고유한 항목으로 구성하는 것입니다.

답변1

시스템이 grepPCRE 모드를 지원하는 경우 다음을 사용할 수 있습니다.주위를 둘러보세요(길이가 0인 어설션) 문자 선택~ 사이 search?q=그리고&

grep -Po '(?<=search\?q=).+?(?=&)'

둘 사이에 탐욕스럽지 않은 수정자를 사용하면 ?첫 번째 항목에서 일치가 중지됩니다 &.

답변2

넌 할 수있어

sed 's/^.*search?q=\([^&]*\)&.*/\1/' file

search?q=그것이 하는 일은 the 와 the 사이에 탐욕스럽지 않은 일치를 수행하는 것입니다.&

어느 출력

dagger+genesis+solo

+기호를 공백으로 바꾸고 싶다면 ,

sed 's/^.*search?q=\([^&]*\)&.*/\1/;s/+/ /g' file

어느 출력

dagger genesis solo

답변3

그리고 sed:

sed 's/\([^=&]*.\)\{2\}&.*/\1/' <<""
http://www.bing.com/images/search?q=dagger+genesis+solo&view=detailv2&&&id=C65E811DFE01FB11258D2EB4F516F3DD8F09049C&selectedIndex=4&ccid=ffC0NVO8&simid=

역참조 일치에 대해 발생 횟수가 지정되면 sed지정된 일치 항목만 인용되어야 합니다. 따라서 위의 예에서 참조는 단지 반환됩니다.

dagger+genesis+solo

답변4

Lookbehind 및 Lookahead 어설션에는 grep을 사용합니다.

grep -oP "\=\K.*(?=\&view)"

여기,

\K          ==>  zero-width look-behind assertion
(?=\&view)  ==>  zero-width look-ahead assertion

그래서 print \=와 ie &view사이의 부분 만요..*

관련 정보