다음은 더 깨끗한 해결책이 있습니까?파일의 첫 번째와 마지막 일치를 인쇄하십시오.
grep INFO messages | head -1
grep INFO messages | tail -1
INFO 또는 메시지의 길이는 임의적입니다.
당신은 당신이 원하는 얼마나 많은 일치 설정-m
을 사용할 수 있습니다
다음은 더 깨끗한 해결책이 있습니까?파일의 첫 번째와 마지막 일치를 인쇄하십시오.
grep INFO messages | head -1
grep INFO messages | tail -1
INFO 또는 메시지의 길이는 임의적입니다.
당신은 당신이 원하는 얼마나 많은 일치 설정-m
을 사용할 수 있습니다
: 이제 tac
와 함께 뒤로 파일을 인쇄 한 후 같은 논리를 사용하자, 마지막에 대한
grep -m1 "INFO" messages
:
를 처음 들어
tac messages | grep -m1 "INFO"
이렇게하면 전체 파일을 두 번 처리하지 않아도됩니다. 일치하는 항목이 발견 될 때까지 처리하게됩니다. man grep
에서
:
-m NUM, --max 카운트 = NUM 일치하는 선 후 파일을 읽는 NUM
중지합니다. 입력이 정규 파일의 표준 입력이고 일치하는 NUM 개의 행이 출력 인 경우 grep은 후행 컨텍스트 라인이 있는지 여부에 상관없이 종료 입력 전에 마지막으로 일치하는 행 다음에 표준 입력이 에 위치하도록합니다. 그러면 에 대한 호출 프로세스가 검색을 재개 할 수 있습니다. grep이 NUM 개의 일치하는 줄 뒤에 멈 추면 은 후행 컨텍스트 줄을 출력합니다. -c 또는 --count 옵션이 도 사용되는 경우 grep은 NUM보다 큰 수를 출력하지 않습니다. -v 또는 --invert-match 옵션도 사용되는 경우 일치하지 않는 행을 출력 한 후 grep이 중지됩니다.
man tac
:
전술 - 연결하여 내가 너희를 AWK 사용할 수 추측 역
에서 인쇄 파일이 배열의 모든 경기를 저장합니다
을awk '/INFO/{a[++i]=$0}END{print a[1];print a[i]}' messages
매우 많은 일치가있는 경우 메모리 소비 문제 일 수 있습니다. 대안은 첫 번째 및 가장 최근에 저장하는 것입니다 :
awk '/INFO/{a[++i>2?2:i]=$0}END{print a[1];print a[2]}' messages
또는 ETAN으로
제안했다 (감사) :awk '/INFO/{a=$0}a&&!i++{print}END{if(a)print a}' messages
이 하나의 장점은이 일치하지 않는 경우 아무것도 인쇄되지 않습니다.
모든 행을 저장할 필요가 없습니다. 가장 먼저 인쇄하고 가장 최근의 것을 저장하십시오. 좋은 점, 나 자신을 생각하고 다른 해결책을 생각해 냈습니다. "/ kernel/{a = $ 0} a &&! i {print; i = 1} END {print a} ' –
고마워요. 감사합니다. –
에드 모튼 (Ed Morton)처럼 하나의 성냥 (또는 없음)이있는 경우를 고려하는 것이 좋습니다. 어쨌든 +1 옵션에 대한 광범위한 설정 :) – fedorqui
awk '/INFO/{f[++c]=$0} END{ if (c>0) print f[1] ORS f[c] }' messages
나 :
이 당신이 원하는 것을 할 수있다
awk '/INFO/{f[++c]=$0} END{ if (c>0) print f[1]; if (c>1) print f[c] }' messages
샘플 입력과 예상 출력이 없어도 추측입니다.
+1 항상 입력이 없다는 규칙에 따르는 것을 잊지 -> 출력 없음 ... –
INFO가 메시지에 나타나지 않거나 한 번만 발생하면 출력은 어떻게되어야합니까? 질문을 편집하여 샘플 입력 및 예상 출력을 표시하십시오. –