다음 줄이 포함된 텍스트 파일의 패턴과 정확히 일치하는 모든 줄을 필터링하고 싶습니다.
c1 and c2 and c15 => r1
c1 and c3 and c11 => r2
c1 and c2 => r3
c2 and c16 => r4
나는 다음 grep
을 사용해 보았습니다.
grep -w "c1" file | grep -w "c2"
정답을 반환합니다.
c1 and c2 and c15 => r1
c1 and c2 => r3
하지만 6개 이상의 grep
명령을 중첩하면 오류가 반환됩니다.
Command ' grep' not found
그런데 비슷한 게 18개나 있어요
grep
중첩할 수 있는 명령의 수에는 제한이 있다는 것을 알고 있습니다. 이를 수행하는 다른 방법이 있습니까?
매우 감사합니다.
답변1
Command ' grep' not found
이것은 오타처럼 들립니다. 파이프 문자 뒤에 일반 공백 대신 줄바꿈 없는 공백을 쳤기 때문입니다. 공백은 명령 이름의 일부입니다. 일반 공백의 경우 공백을 명시적으로 인용하거나 이스케이프해야 합니다.
... | " grep"`
그러나 파이프가 AltGr-뭔가이고 잘림 방지 공백이 AltGr-space인 일부 키맵(나 같은)의 경우 수정자 키를 너무 천천히 놓으면 오류가 발생합니다. (또는 Mac에서는 AltGr 대신 Option을 사용하세요.)
명령줄을 다시 입력해 보세요. 장기적인 해결책은 키맵을 수정하여 해당 트랩을 제거하거나 입력을 시작하는 것입니다 ... |grep
. 그러면 적어도 눈에 띄는 차이를 얻을 가능성이 더 커집니다.
답변2
사용 awk
:
awk -v arrayvar="c1,c2" '
{
split(arrayvar, a, ",")
for(i in a){
r="(^|" FS ")" a[i] "($|" FS ")"
if($0 !~ r) next
}
print
}' input
우리는 사용하고 있습니다split()
기능.
split(s, a [, r [, seps] ])
정규식 r에서 문자열 s를 배열 a와 구분 기호 배열 sep로 분할하고 필드 수를 반환합니다.
그런 다음 행에 모든 패턴이 포함되어 있는지 확인합니다.
r="(^|" FS ")" a[i] "($|" FS ")"
^
FS
or (필드 구분 기호)로 시작하고 패턴이 있고 or로 a[i]
끝나는 정규 표현식$
FS
줄에 패턴이 포함되어 있지 않으면 건너뜁니다.
답변3
PCRE를 지원하는 경우 grep
다음을 시도해 보세요.
grep -P '(?=.*c1 )(?=.*c2)' file
그 뒤의 공백에 주의하십시오 c1
. 그러면 일치하는 항목이 없습니다 c15
.