특정 범위 내의 단어 또는 길이를 포함하는 Grep 라인?

특정 범위 내의 단어 또는 길이를 포함하는 Grep 라인?
1598427@931
PDD   220624P00051000 ohlc=0,0,0,0 vol=0 oi=424 nbbo=69@2316/113@532 nbbo2=69@145/113@95
PDD   220617C00051000 ohlc=0,0,0,0 vol=0 oi=434 nbbo=530@1921/710@1496 nbbo2=530@31/710@115
PDD   220722P00051000 ohlc=0,0,0,0 vol=0 oi=15 nbbo=285@1436/405@1772 nbbo2=230@15/455@15
PDD   220708C00051000 ohlc=0,0,0,0 vol=0 oi=17 nbbo=785@864/935@894 nbbo2=785@15/935@15
PDD   220624C00051000 ohlc=0,0,0,0 vol=0 oi=392 nbbo=645@771/795@947 nbbo2=645@83/795@80
PDD   220729C00051000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=870@902/1190@677 nbbo2=820@15/1195@20
PDD   220708P00051000 ohlc=0,0,0,0 vol=0 oi=32 nbbo=200@1413/320@2273 nbbo2=200@15/320@356
PDD   220722C00051000 ohlc=0,0,0,0 vol=0 oi=140 nbbo=795@1630/1175@1544 nbbo2=795@51/1175@21
PDD   220729P00051000 ohlc=0,0,0,0 vol=0 oi=11 nbbo=254@3/450@3 nbbo2=254@2/570@1
CSCO  220715C00090000 ohlc=0,0,0,0 vol=0 oi=739 nbbo=0@0/4@1056 nbbo2=0@0/4@121
CSCO  220617C00090000 ohlc=0,0,0,0 vol=0 oi=203 nbbo=0@0/1@2 nbbo2=0@0/0@0
CSCO  220617P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4685@654/4730@1155 nbbo2=4685@33/4730@33
CSCO  240119P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4695@202/4770@193 nbbo2=4695@75/4770@33

위와 비슷한 파일이 있습니다.

CSCO단어 또는 길이가 포함된 모든 줄을 찾고 싶습니다 <= 15.

이 작업을 수행하려면 어떤 명령을 사용할 수 있나요?

답변1

grep -E확장 정규식 의 경우 교대( |)를 사용할 수 있습니다.

$ grep -E 'CSCO|^.{0,15}$' file
1598427@931
CSCO  220715C00090000 ohlc=0,0,0,0 vol=0 oi=739 nbbo=0@0/4@1056 nbbo2=0@0/4@121
CSCO  220617C00090000 ohlc=0,0,0,0 vol=0 oi=203 nbbo=0@0/1@2 nbbo2=0@0/0@0
CSCO  220617P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4685@654/4730@1155 nbbo2=4685@33/4730@33
CSCO  240119P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4695@202/4770@193 nbbo2=4695@75/4770@33

공백(공백, 탭 등)이 뒤따르는 줄 시작 부분의 "CSCO"만 일치시키려는 경우:

$ grep -E '^CSCO[[:space:]]|^.{0,15}$' file

또는 후행 경계 표시를 사용합니다 \>(이것이 GNU 확장인지 "표준"인지 기억이 나지 않으며 Google에서 검색하기 어렵습니다. 확실히 GNU grep에서 작동하며 다른 언어에서도 작동할 수도 있습니다).

$ grep -E '^CSCO\>|^.{0,15}$' file

GNU grep의 정보 문서에서는 "단어" 문자를 [_[:alnum:]]man 페이지의 정의와 달리 로 정의하고 perlre있으며 Perl은 일부 연결 구두점 및 유니코드 문자도 "단어"로 인식합니다.

GNU grep을 사용하는 경우 해당 버전은 Perl의 \s(모든 공백) 및 \b(단어 경계 표시자) 도 이해합니다. -E대신 -PGNU grep의 -PPCRE 지원 옵션을 사용하면 \h가로 공백 인식이 추가됩니다. 예를 들어

$ grep -E '^CSCO\s|^.{0,15}$' file
$ grep -E '^CSCO\b|^.{0,15}$' file
$ grep -P '^CSCO\h|^.{0,15}$' file

답변2

grep -e CSCO -e '^.\{0,15\}$' filename

여기서는 grep에 찾을 두 가지 패턴을 제공합니다. 첫 번째는 "CSCO"입니다. 따라서 일치하는 모든 행과 일치합니다. 두 번째 명령은 줄의 시작 부분을 찾고 ^그 뒤에 .0번에서 15번까지 나타나는 문자 \{0,15\}와 줄의 끝 부분을 찾습니다 $.

CSCO가 완전한 "단어"여야 하고 더 큰 단어나 패턴의 일부가 아니어야 하는 경우 구현 에 따라 '\<CSCO\>'또는 을 '\bCSCO\b'사용할 수 있습니다 ( 는 가장 일반적으로 지원됨). 단어 경계 연산자는 하나와 일치합니다. 변환 지점에 단어 문자(숫자 또는 밑줄)와 단어가 아닌 문자 하나(다른 모든 문자)가 있습니다.'[[:<:]]CSCO[[:>:]]'grep\<\>

답변3

CSCO아마 1일에 제출한 것 같아요 . 이상한 방법:

awk '$1 == "CSCO"; length <= 15 { print }' INPUT
# length is a built-in awk function which returns the length of a line

답변4

사용행복하다(이전 Perl_6)

raku -ne '.put if (.contains("CSCO")) | (.chars <= 15);'   

또는

raku -ne '.put if .contains("CSCO") or .chars <= 15;'   

입력 예:

1598427@931
PDD   220624P00051000 ohlc=0,0,0,0 vol=0 oi=424 nbbo=69@2316/113@532 nbbo2=69@145/113@95
PDD   220617C00051000 ohlc=0,0,0,0 vol=0 oi=434 nbbo=530@1921/710@1496 nbbo2=530@31/710@115
PDD   220722P00051000 ohlc=0,0,0,0 vol=0 oi=15 nbbo=285@1436/405@1772 nbbo2=230@15/455@15
PDD   220708C00051000 ohlc=0,0,0,0 vol=0 oi=17 nbbo=785@864/935@894 nbbo2=785@15/935@15
PDD   220624C00051000 ohlc=0,0,0,0 vol=0 oi=392 nbbo=645@771/795@947 nbbo2=645@83/795@80
PDD   220729C00051000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=870@902/1190@677 nbbo2=820@15/1195@20
PDD   220708P00051000 ohlc=0,0,0,0 vol=0 oi=32 nbbo=200@1413/320@2273 nbbo2=200@15/320@356
PDD   220722C00051000 ohlc=0,0,0,0 vol=0 oi=140 nbbo=795@1630/1175@1544 nbbo2=795@51/1175@21
PDD   220729P00051000 ohlc=0,0,0,0 vol=0 oi=11 nbbo=254@3/450@3 nbbo2=254@2/570@1
CSCO  220715C00090000 ohlc=0,0,0,0 vol=0 oi=739 nbbo=0@0/4@1056 nbbo2=0@0/4@121
CSCO  220617C00090000 ohlc=0,0,0,0 vol=0 oi=203 nbbo=0@0/1@2 nbbo2=0@0/0@0
CSCO  220617P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4685@654/4730@1155 nbbo2=4685@33/4730@33
CSCO  240119P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4695@202/4770@193 nbbo2=4695@75/4770@33

예제 출력:

1598427@931
CSCO  220715C00090000 ohlc=0,0,0,0 vol=0 oi=739 nbbo=0@0/4@1056 nbbo2=0@0/4@121
CSCO  220617C00090000 ohlc=0,0,0,0 vol=0 oi=203 nbbo=0@0/1@2 nbbo2=0@0/0@0
CSCO  220617P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4685@654/4730@1155 nbbo2=4685@33/4730@33
CSCO  240119P00090000 ohlc=0,0,0,0 vol=0 oi=0 nbbo=4695@202/4770@193 nbbo2=4695@75/4770@33

Raku의 답변은 다른 코드 요소에 비해 OR 명령의 우선순위를 존중해야 합니다. 위의 첫 번째 예에서는 |(우선순위가 높은) (파이프라인) OR 연산자의 양쪽에 있는 두 조건 주위에 괄호를 배치하여 원하는 답을 얻습니다. 괄호를 제거하려면 (낮은 우선순위) or(소문자) OR 연산자를 사용하세요.

아래 두 번째 URL의 참조 내용을 참고하세요." or악용되기 쉬우니 주의하시기 바랍니다.".

https://docs.raku.org/언어/operators#Operator_precedence
https://docs.raku.org/routine/또는
https://docs.raku.org/routine/|

관련 정보