[unix] 일치하는 모든 파일 표시

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

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

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



답변

Sed 가 더 좋습니다.

그냥 해:

sed '/PATTERN/q' FILE

다음과 같이 작동합니다.

각 줄마다 다음과 일치하는지 확인합니다 /PATTERN.

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

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

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

sed 10q FILE


답변

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


답변

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

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

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

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


답변

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

세 개의 s를 사용하여 파일 막대 에서 문자열 ” foo ” 의 첫 번째 인스턴스 까지 모든 것을 검색 하십시오 .grep

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

foo ” 의 마지막 인스턴스와 일치 :

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

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


답변

위의 Mikel의 답변에 추가 …


모든 행을 인쇄하려면 포함 최대 아니지만 , 첫 번째 줄 FILE포함을 PATTERN시도 :

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

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


추신:

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

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

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

sed '/PATTERN/q' FILE | sed '$d'


답변

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

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

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


답변

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

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’를 변경하여 변경할 수도 있음) 해당 번호에서 head를 사용합니다

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

pattern
texttexttext
texttexttext texttexttext
texttexttexttexttexttexttexttexttext
pattern
texttexttext
pattern 
texttexttext
texttexttexttexttexttexttexttexttext

기타 등등