为什么 grep 会根据终端宽度输出不同的结果?
Why does grep output a different result based on the terminal width?
在 this file 上执行命令 grep blackdetect 01.txt
时,我得到的输出取决于终端的宽度,这对我来说有点奇怪。
zshell 中宽度为 79 或更小的输出为:
frame= 1 fps=0.0 q=-0.0 size=N/A time=00:00:00.01 bitrate=N/A speed=0.671x frame= 358 fps=0.0 q=-0.0 size=N/A time=00:00:06.44 bitrate=N/A speed=12.2x [blackdetect @ 0x7fb809109300] black_start:6.7329 black_end:6.7689 black_duration:0.0360048
宽度为 80 时:
frame= 1 fps=0.0 q=-0.0 size=N/A time=00:00:00.01 bitrate=N/A speed=0.671x [blackdetect @ 0x7fb809109300] black_start:6.7329 black_end:6.7689 black_duration:0.0360048
宽度为 81 及以上时,它给出了我认为应该正确的结果:
[blackdetect @ 0x7fb809109300] black_start:6.7329 black_end:6.7689 black_duration:0.0360048
我对这个结果很困惑,这是怎么回事,我该如何解决?
*.txt
文件由 运行 ffmpeg
创建并通过管道将 stderr 传输到文件。
系统详情:
硬件:MacBook Pro 2015
操作系统:macOS Big Sur(版本 11.5.2)(最新更新)
处理器:Intel Core i7,2.2GHz 四核
我怀疑您的输出包含 Carriage Return (CR) 字符(0x0D
、\r
),它会将光标移动到行首而不前进到下一行线。这是终端中行的开头,而不是输出行的开头。从您的输出来看,[blackdetect @ 0x7fb80909300]
一词前面似乎有一个,但很可能还有更多。
您可以使用 cat -vET
将 CR 可视化,其中它将转换为 ^M
组合。
$ command | cat -vET`
您可以通过以下简单示例了解 CR 和终端宽度的效果:
$ a=$(printf "%s" {0..9})
$ echo $a$a$a$'\r'$a
终端宽度为 23,输出如下:
012345678901234567890123
0123456789
你清楚地看到第二行缺少字符 456789
。
相关: How to replace carriage return without new line in FFmpeg output thanks to sed?
在 this file 上执行命令 grep blackdetect 01.txt
时,我得到的输出取决于终端的宽度,这对我来说有点奇怪。
zshell 中宽度为 79 或更小的输出为:
frame= 1 fps=0.0 q=-0.0 size=N/A time=00:00:00.01 bitrate=N/A speed=0.671x frame= 358 fps=0.0 q=-0.0 size=N/A time=00:00:06.44 bitrate=N/A speed=12.2x [blackdetect @ 0x7fb809109300] black_start:6.7329 black_end:6.7689 black_duration:0.0360048
宽度为 80 时:
frame= 1 fps=0.0 q=-0.0 size=N/A time=00:00:00.01 bitrate=N/A speed=0.671x [blackdetect @ 0x7fb809109300] black_start:6.7329 black_end:6.7689 black_duration:0.0360048
宽度为 81 及以上时,它给出了我认为应该正确的结果:
[blackdetect @ 0x7fb809109300] black_start:6.7329 black_end:6.7689 black_duration:0.0360048
我对这个结果很困惑,这是怎么回事,我该如何解决?
*.txt
文件由 运行 ffmpeg
创建并通过管道将 stderr 传输到文件。
系统详情: 硬件:MacBook Pro 2015 操作系统:macOS Big Sur(版本 11.5.2)(最新更新) 处理器:Intel Core i7,2.2GHz 四核
我怀疑您的输出包含 Carriage Return (CR) 字符(0x0D
、\r
),它会将光标移动到行首而不前进到下一行线。这是终端中行的开头,而不是输出行的开头。从您的输出来看,[blackdetect @ 0x7fb80909300]
一词前面似乎有一个,但很可能还有更多。
您可以使用 cat -vET
将 CR 可视化,其中它将转换为 ^M
组合。
$ command | cat -vET`
您可以通过以下简单示例了解 CR 和终端宽度的效果:
$ a=$(printf "%s" {0..9})
$ echo $a$a$a$'\r'$a
终端宽度为 23,输出如下:
012345678901234567890123
0123456789
你清楚地看到第二行缺少字符 456789
。
相关: How to replace carriage return without new line in FFmpeg output thanks to sed?