的 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行。用于计算的shell项:($((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
命令中。但是为了灵活性,可以在一些shell脚本中使用变量。
对于基于文件大小的条件处理,可以使用以下“测试”构造:
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
这意味着:“如果大小$file
超过100kB,请执行...”(以5k为单位ls -lk
列出文件大小,因此awk
将其精确地提取出来)。