sed
접근 방식은 괜찮지 만 모든 라인을 통해 루프 없습니다. 몇 줄을 유지하고 싶은지 알고 있다면 (예를 들어 99를 사용합니다) 다음과 같이 할 수 있습니다.
sed -i '100,$ d' myfile.txt
설명 : sed
정규식 프로세서입니다. -i
지정된 옵션을 사용하면 파일을 읽고 결과를 표준 출력에 쓰는 대신 파일을 직접 처리합니다 ( "인라인"). 100,$
"100 행부터 파일의 끝까지"를 의미하고 명령 뒤에 d
"삭제"를 나타내는 것으로 추측됩니다. 즉, 명령은 "myfile.txt에서 100 행부터 파일 끝까지의 모든 행을 삭제합니다"를 의미합니다. 99 행을 유지하려면 100이 첫 번째로 삭제됩니다.
편집 : 반면에 마지막 100 줄 을 유지하려는 로그 파일이있는 경우 :
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt
여기서 무슨 일이 일어나고 있습니까?
[ $(wc -l myfile.txt) -gt 100 ]
: 파일에 100 줄 이상이있는 경우에만 다음을 수행하십시오.
$((100 - $(wc -l myfile.txt|awk '{print $1}')))
: 삭제할 줄 수 계산 (예 : (마지막) 100을 제외한 파일의 모든 줄)
1, $((..)) d
: 첫 번째 줄부터 계산 된 줄까지 모든 줄을 제거합니다.
편집 : 자세한 내용을 제공하기 위해 질문을 방금 편집 했으므로이 추가 정보를 답변과 함께 포함시킵니다. 추가 된 사실은 다음과 같습니다.
- 특정 크기 는 파일과 함께 남아 있어야합니다 (10,000 바이트)
- 각 줄은 바이트 단위의 특정 크기를가집니다 (이 예에서는 300 바이트)
이 데이터에서 "/"로 유지 될 줄 수를 계산할 수 있습니다. 예를 들어 33 줄을 의미합니다. 계산을위한 쉘 용어 : $((size_to_remain / linesize))
(적어도 Bash를 사용하는 Linux에서는 결과는 정수임) 조정 된 명령은 이제 다음과 같습니다.
# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt
크기가 미리 알려져 있으므로 더 이상 sed
명령에 포함 된 계산이 필요하지 않습니다 . 그러나 유연성을 위해 일부 쉘 스크립트 내에서 변수를 사용할 수 있습니다.
파일 크기에 따른 조건부 처리의 경우 다음 "test"-construct를 사용할 수 있습니다.
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
"크기 $file
가 100kB 를 초과하면 수행 ..."을 의미합니다 ( ls -lk
위치 5에서 파일 크기를 kB로 나열하므로 awk
정확하게 추출하는 데 사용됨).