파일에서 그렙 패턴 읽기


49

나는 두 개의 큰 텍스트 파일을 UNIQS.txt가지고 있으며 파일 에는 grep다른 파일 의 문자열 목록이 있습니다 . 내가 사용하는 코드는

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

아무것도하지 않습니다-생성 된 파일이 비어 있습니다. 하지만 내가 할 때

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

제대로 작동합니다. 따옴표와 슬래시없이 정규 표현식 패턴으로 grep항목을 해석 하지 않을 것이라고 생각했기 때문에 혼란 스럽습니다 ( UNIQS.txt없는 파일). 일반적으로 파일에서 패턴을 가져 오는 경우 자동으로 해당 패턴이 정규 표현식 패턴이라고 생각합니까?

편집 : 에서 UNIQS.txt파일 형식의 줄 바꿈 분리 된 문자열이 있습니다

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(템플릿 이름이라고 함) 및 파일 EEP_VSL...탭으로 구분 된 열은 약 14 열이며 첫 번째 열은 템플릿 이름이므로 기본적으로 파일의 각 템플릿에 해당하는 줄을 추출하고 싶습니다.

답변:


60

-f옵션은 grep이 패턴을 읽는 파일을 지정합니다. -e쉘에서 호출 할 때 쉘에서 특수 문자가 확장되지 않도록 패턴을 인용해야 할 수 있다는 점을 제외하고 명령 행에서 패턴을 전달하는 것과 같습니다 ( 하나 이상이있는 경우 옵션 사용).

인수 -Eor -F또는 -P(있는 경우)는 grep에게 패턴이 작성된 구문을 알려줍니다. 인수없이 grep은 기본 정규 표현식을 기대 합니다 . 와 함께 -Egrep은 확장 된 정규 표현식을 기대 합니다 . 와 -P(지원되는 경우), GREP 기대 펄 정규 표현식 ; 와 함께 -Fgrep은 리터럴 문자열을 기대합니다. 패턴이 명령 행에서 오는지 또는 파일에서 오는지는 중요하지 않습니다.

문자열은 하위 문자열입니다. a+b패턴으로 전달하면 포함하는 행 a+b+c이 일치합니다. 제공된 문자열 중 하나만 포함하고 더 이상 포함하지 않는 행을 검색하려면 -x옵션 을 전달하십시오 .


1
좋습니다. 유용한 감사합니다. 문자열을 정확히 일치시키고 싶다고 가정 할 수 있습니까, 예를 들어 문자열이 12345 인 경우 123456 또는 123455 등이 아닌 12345에서만 일치시키기를 원한다면 어떻게해야합니까?
sdf

2
@sdf 나의 마지막 단락을 읽으십시오 :-x
Gilles 'SO- 악의를 멈추십시오'

너무 오래되어 파서 죄송합니다. 위의 설명은 훌륭하지만 파일의 패턴 (문자열)이 플래그 없이 일치하지 않는 이유 는 약간 모호합니다 -F. 내 생각에 -위의 샘플 라인 에서이 문자 시퀀스로 읽 히게됩니까? 대괄호도 필요하지 않습니까? 일부 샘플 파일로 테스트했지만 결론에 도달하지 못했습니다.
trs

@trs 질문에 표시된 행 (내 답변을 게시 한 후 추가 됨)에는 정규 표현식에서 특별한 의미가있는 문자가 포함되어 있지 않으므로와 함께 또는없이 동일하게 동작합니다 -F. 와 같은 문자를 사용하여 차이를 만들 수 \[*^$있습니다.
Gilles 'SO- 악마 그만해'

@Gilles 고맙습니다. 저의 인상이기도했지만 @sdf는 -F플래그 없이 "생성 된 파일이 비어 있습니다"(읽기 : 일치하지 않음)라고 주장 합니까?
trs

0

@gilles의 좋은 대답으로 해결되지 않은 동일한 오류가 발생했습니다. 입력 파일을 자세히 살펴보면 끝에 2 줄 바꿈이 발견되었습니다. 이것 없이는 성공 만 필요합니다 : grep -i file_pattern_input file

(GNU grep 3.1, 입력 파일 5000 개 이상의 레코드, 일치 / 패턴 파일 2536, 2536이 모두 파일에 있어야한다는 것을 알았습니다. 개행은 파일의 모든 행을 가져 왔으며 2536 개의 일치하는 행은 없었습니다)


1
그것은 OP의 문제와 관련이 없습니다. 빈 줄은 grep에 의해 빈 패턴으로 읽히고 빈 패턴은 모든 곳에서 일치합니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.