bash - 从进程主动写入的bash内联中的文件开头删除前N个字节/行
问题描述
在连续记录数据时,我需要从日志文件中删除/截断前 N 个字节。例如 nohup.out
虽然我可以bash
像这样使用截断命令。
truncate -c -s -10K my_file
.
这将截断文件末尾的最新数据。所以在这种情况下没有用。
我需要从文件开头截断文件(具有旧数据)并保留新文件。
我在网上查了一下,大多数示例都使用重定向或写入临时文件dd
等head
。我需要在同一个文件上内联执行此操作。
最接近的匹配是sed
,但到目前为止,我发现了从每一行中截断 N 个字符的示例。例如,下面将从 my_file 中的每一行删除 10 个字节。
sed -i 's/^\(.\)\{10\}//g' my_file
我正在寻找可以删除前 N 个字节的选项,从第 1 行开始,到第 K 行结束,其中第 N 个字节删除结束,从而在底部保留最新数据。
我可能可以编造一些逻辑来实现这一点,但想知道是否有“现成的”选项可用。
任何指针?谢谢。
解决方案
以下将打印行,直到包含第 N 个字节的行:
awk -v n="$n" 'c>=n{exit} {c+=length()+1} 1'
其中 shell 变量$n
包含对您很重要的字节数。在+1
那里,以便包含换行符。如果您没有单字符换行符,请调整以适应,或者length(ORS)
改用。
请注意,这不会处理您请求中不可能的部分,即在另一个进程打开文件进行写入时更改文件。
为了实现与此相反的操作——也就是说,打印从第 N 个字节开始的每一行,我们需要一些稍微不同的东西:
awk -v n="$n" 'c>=n{p=1} {c+=length()+1} p'
这将设置一个信号量,p
一旦看到足够的字符,如果信号量评估为真,则打印。
性能低得多的等效 bash-only 版本可能如下所示:
c=0; p=0
while read; do
((c>=n)) && p=1
((c+=${#REPLY}+1))
((p)) && echo "$REPLY"
done
您可以将其用作管道,或使用输入重定向来读取文件。它还假设$n
包含一个整数。
推荐阅读
- c# - Telerik RadGridView 的 IDataErrorInfo 验证
- python - 如何从python的列表中删除包含特定字符的字符串
- sql-server - 如何处理并发问题?
- python - 从 dict 和 list 生成数据框的最简单方法
- string - 如何将飞镖中的字符串内的两个变量相乘?
- ms-access - DLOOKUP 用于使用 2 个组合框选择填充文本框
- python - 从数据框中搜索单元格中的每个字符串并从另一个数据框列中查找(匹配)相同的字符串将索引返回到新准备的数据框
- c# - 禁用面板上的鼠标滚轮滚动。C#
- javascript - 谷歌控制台中jquery双击的问题
- html - 引导导航栏汉堡菜单单击后无响应