作者Gold740716 (项为之强)
看板Linux
标题[问题] 用 regexp 切割文字串流为一个个档案
时间Fri Jul 19 13:53:15 2019
最近有一批每秒一笔的资料,
本来是切割成一天天的档案,但发现他的切割时间错误,
变成一天从 00:11:23 开始,在隔天的 00:11:22 结束。
想把他重新切割成在零点分割的档案。
本来是这样:
```sh
start_day=1
cat *.log | while true
do
sed /23:59:59/q > ../fix/$start_day.log
start_day=$((start_day+1))
done
```
但我发现在不同命令间会漏掉一些资料。
後来想到的解法是一天天解决:
```sh
for day in `seq 10`
do
sed -n '/00:00:00/,$p' $day.log > ../fix/$day.log
sed -n '1,/23:59:59/p' $((day+1)).log >> ../fix/$day.log
done
```
另外一个选项是用 split 用行数拆分,
但我发现这些档案好像不是完整每秒都有,
所以一天会不到 86400 笔。
有办法在 shell 用 regexp 分割管道来的资料吗?
我试过用 sed 和 awk 在执行下一个命令时都会漏掉资料,
但用 dd 就不会漏。
如果写个 perl 或 python 好像蛮简单的。
--
如果孔子是那待沽的玉
我便是待斟的酒
用一生的时间 蕴酿自己的浓度
只为等待刹那的倾注
张晓风 酿酒的理由
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.127.95 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1563515599.A.036.html
1F:→ dibery: *.log 会在执行期间写入新资料吗 内容格式取几行范例出来 07/21 21:00
2F:→ dibery: 会漏资料感觉满怪的 行结尾有一致吗 07/21 21:02
不会写入新资料。
你可以试试
```sh
yes | nl | {
sed 4q
sed 8q
}
```
的确会掉资料。
我试过用 pv 控制管道在低速掉的资料就会变少:
```sh
yes | nl | pv -L 64 | {
sed 4q
sed 8q
}
```
※ 编辑: Gold740716 (114.37.44.148 台湾), 07/22/2019 16:22:15