it-swarm-ko.tech

일치하는 모든 파일 표시

grep --before-context 5는 경기 전 5 줄을 보여줍니다.

경기 전에 모든 것을 보여주고 싶습니다.
_ grep --before-context 99999999는 효과가 있지만 그다지 전문적이지는 않습니다.

일치하는 모든 파일을 표시하는 방법?

78
Nicolas Raoul

Sed 가 더 좋습니다.

그냥 해:

sed '/PATTERN/q' FILE

다음과 같이 작동합니다.

각 줄마다 /PATTERN :

  • 그렇다면, 우리는 그것을 인쇄하고 종료
  • 그렇지 않으면, 우리는 그것을 인쇄

이것이 가장 효율적인 솔루션입니다. PATTERN가 보이면 바로 종료됩니다. q이 없으면 sed는 파일의 나머지 부분을 계속 읽고 아무 ​​것도 수행하지 않습니다. 큰 파일의 경우 차이를 만들 수 있습니다.

이 트릭을 사용하여 head을 에뮬레이션 할 수도 있습니다.

sed 10q FILE
104
Mikel

sed는 대부분의 grep 기능을 대체 할 수 있습니다.

sed -n '1,/<pattern>/ p' <file>

즉, 패턴이 일치 할 때까지 첫 번째 줄에서 인쇄합니다.

몇 가지 범위 예제

sed -n '/<pattern>/,$ p' <file> # from pattern to end of file
sed -n '/<pattern1>/,/<pattern2>/ p' <file> # from pattern1 to pattern2
39
forcefsck

일치하는 것을 포함하여 인쇄하십시오.

awk '{print} /pattern/ {exit}' filename
sed '/pattern/q' filename

일치 항목을 제외하고 최대 인쇄 :

awk '/pattern/ {exit} {print}' filename
sed '/pattern/Q' filename
39
glenn jackman

일상 업무에서 기본 도구 만 기억하고 덜 우아하고 덜 효율적인 솔루션을 기꺼이 받아들이려는 사람들에게 :

head -n $(grep -n pattern filename | cut -d: -f1) filename

이 명령이 스크립트를위한 것이라면 더 우아하고 (아마도 효율적인) 솔루션을 찾을 것입니다. 이것이 일회성 명령이거나 스크립트를 버리면 상관 없습니다.

1
lesmana

위의 Mikel 답변 추가 ...


FILE을 (를) 포함하는 PATTERN의 첫 번째 줄인 최대,을 포함하지는 않음을 인쇄하려면 다음을 시도하십시오.

  • sed '/.*PATTERN.*/{s///;q;}' FILE

이것은 패턴을 포함하는 전체 행과 일치하고이를 빈 행으로 바꾸고 나머지 파일을 처리하지 않고 종료합니다.


추신:

마지막에 (다른 도구를 사용하지 않고) 추가 줄 바꿈이 인쇄되지 않도록 생각할 수있는 가장 쉽고 명확한 방법은 sed를 다시 실행하고 새 마지막 줄을 삭제하는 것입니다.

sed '/.*PATTERN.*/{s///;q;}' FILE | sed '$d'

... 어쨌든 우리는 이제 그 라인을 삭제하고 있기 때문에 이전 작업이 중복되어 다음과 같이 단순화 할 수 있습니다.

sed '/PATTERN/q' FILE | sed '$d'
1
Jim Grisham

다음과 같은 순수한 GNU grep) 방법은 효율적이지 않습니다.

에서 문자열 " foo "의 first 인스턴스까지 모든 것을 검색합니다. 세 개의 greps를 사용하여 파일 bar :

grep -m 1 -B $(grep -n -m 1 foo bar | grep -o '^[0-9]*') foo bar

" foo "의 last 인스턴스와 일치 :

grep -oPz "(?s)[^\n]*${s}.*?\n.*?foo.*?\n" bar

참고 : 마지막 grep에 대한 자세한 내용은 다음에서 찾을 수 있습니다. 여러 줄 검색을위한 정규 표현식 (grep) .

1
agc

다음 중 하나를 사용할 수도 있습니다.

tac ./test | grep -B $(cat ./test | wc -l) -m 1 'pattern'|tac 

또는

tac ./test |head -n $(tac ./test | grep -n 'pattern' | cut -d: -f1 | head -n 1)|tac

또는

tac ./test |sed ':a;N;$!ba;s/\n/'"pattern"'/g' | sed 's/'"patternpattern"'/\n/g'|head -n 1|sed 's/'"pattern"'/\n/g'|tac

첫 번째 옵션은 OP가 제안한 것과 매우 유사하며 파일에서 줄을 계산하여 컨텍스트 전에 충분한 줄을 표시하도록합니다.

두 번째 옵션은 첫 번째 일치 항목의 행 번호를 검색합니다 (내부 '헤드'를 변경하여 변경할 수도 있음).

마지막 옵션은 모든 새 줄을 일치 항목으로 바꾸고 두 개의 인접한 일치 항목을 새 줄로 바꿉니다. 이 결과는 두 개의 일치 항목 사이의 모든 텍스트 블록에 대한 줄입니다. 그런 다음 'head'를 사용하여 첫 번째 줄 (텍스트 블록을 첫 번째로 일치시킬 때까지 일치)을 선택하고 각 일치 항목을 새 줄로 다시 변환합니다. 이 옵션은 파일이 다음 형식 인 경우에만 작동합니다

pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern 
texttexttext
texttexttexttexttexttexttexttexttext

기타 등등

0
user122778