grep --before-context 5
경기 전 5 줄을 보여줍니다.
경기 전에 모든 것을 보여주고 싶습니다. 일하는 것은 효과가 있지만
그렇게 grep --before-context 99999999
전문적이지는 않습니다.
일치하는 모든 파일을 표시하는 방법?
답변
Sed 가 더 좋습니다.
그냥 해:
sed '/PATTERN/q' FILE
다음과 같이 작동합니다.
각 줄마다 다음과 일치하는지 확인합니다 /PATTERN
.
- 그렇다면, 우리는 그것을 인쇄하고 종료
- 그렇지 않으면, 우리는 그것을 인쇄
가장 효율적인 솔루션입니다.이 즉시 PATTERN
보이면 종료됩니다. 가 없으면 q
sed는 파일의 나머지 부분을 계속 읽고 아무 것도 수행하지 않습니다. 큰 파일의 경우 차이를 만들 수 있습니다.
이 트릭을 사용하여 에뮬레이션 할 수도 있습니다 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
기타 등등