[linux] 파일 중간에 특정 줄을 표시하는 빠른 유닉스 명령?

서버와 내 유일한 로그 파일로 문제를 디버깅하려고하면 20GB 로그 파일입니다 (타임 스탬프조차도 없습니다! 사람들은 왜 사용합니까? System.out.println() 이 로깅으로 ?)

grep을 사용하여 347340107 행에서 살펴볼 파일 영역을 찾았습니다.

같은 일을하는 것 외에

head -<$LINENUM + 10> filename | tail -20 

head로그 파일의 처음 347 백만 행을 읽어야하는 경우 콘솔에 347340100-347340200 행을 덤프하는 빠르고 쉬운 명령이 있습니까?

업데이트 grep이 일치하는 컨텍스트를 인쇄 할 수 있다는 것을 완전히 잊어 버렸습니다 … 이것은 잘 작동합니다. 감사!



답변

GNU-grep을 사용하면 말할 수 있습니다.

grep --context = 10 ...


답변

줄 번호를 알고 있지만 다른 정보가 없으면 다른 두 가지 해결책을 찾았습니다 .

20 ~ 40 행이 필요하다고 가정하면,

sed -n '20,40p;41q' file_name

또는

awk 'FNR>=20 && FNR<=40' file_name


답변

# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3,  efficient on large files 

큰 파일에 효율적인 방법 3

특정 라인을 표시하는 가장 빠른 방법


답변

아니요, 파일은 주소를 지정할 수 없습니다.

텍스트 파일에서 줄 n 의 시작을 찾는 일정한 시간 방법은 없습니다 . 파일을 통해 스트리밍하고 개행을 계산해야합니다.

작업을 수행해야하는 가장 단순하고 빠른 도구를 사용하십시오. 나를 위해, 사용이 head만드는 훨씬 더 의미 grep후자는 방법이 더 복잡하기 때문에. 나는 ” grep느리다” 라고 말하는 것이 아니라 실제로는 그렇지 않지만 head이 경우 보다 더 빠르면 놀랄 것 입니다. head기본적으로 버그입니다 .


답변

이건 어떤가요:

tail -n +347340107 filename | head -n 100

나는 그것을 테스트하지 않았지만 그것이 효과가 있다고 생각합니다.


답변

난 그냥 들어가 선호 less하고

  • 입력 50%하여 파일의 중간으로 이동
  • 43210G 43210 행으로 이동
  • :43210 똑같이

그런 것들.

더 좋은 방법 : v해당 위치에서 편집을 시작하십시오 (vim에서!). 이제 vim동일한 키 바인딩이 있습니다.


답변

먼저 파일을 이처럼 몇 개의 작은 파일로 분할했습니다

$ split --lines=50000 /path/to/large/file /path/to/output/file/prefix

그런 다음 결과 파일을 grep하십시오.