로그 트래픽을 관찰하고 있는데 다양한 이미지 검색 엔진(특히 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
시스템이 grep
PCRE 모드를 지원하는 경우 다음을 사용할 수 있습니다.주위를 둘러보세요(길이가 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
사이의 부분 만요..*