gpt4 book ai didi

pipe - 为什么通过 grep 的输出管道以 block 的形式出现而不是逐行出现?

转载 作者:行者123 更新时间:2023-12-01 00:40:36 24 4
gpt4 key购买 nike

我的命令行存在巨大的性能问题。如果我输入:

hcidump -a

我得到以下输出:
> HCI Event: LE Meta Event (0x3e) plen 42
LE Advertising Report
ADV_IND - Connectable undirected advertising (0)
bdaddr 78:A5:04:17:9F:66 (Public)
Flags: 0x06
Unknown type 0xff with 25 bytes data
RSSI: -26
> HCI Event: LE Meta Event (0x3e) plen 41
LE Advertising Report
SCAN_RSP - Scan Response (4)
bdaddr 78:A5:04:17:9F:66 (Public)
Complete local name: 'BEACON 17:9F:66'
TX power level: 0
Unknown type 0x16 with 7 bytes data
RSSI: -26

每个信息块都实时出现在屏幕上。但是因为我只需要 RSSI 中的值,所以我使用这个命令来获取它:
hcidump -a | egrep 'RSSI|bdaddr' | grep -A1 --no-group-separator 'bdaddr 78:A5:04:17:9F:66' | grep -Po 'RSSI:\s+\K.*'

它工作得很好,但我有巨大的性能问题。由于两位数值不是一个一个地出现在屏幕上,而是以块的形式出现。 12-15 秒内什么也没发生,然后我一次得到 40 个值。有没有人知道问题是什么?

管道命令是否使用缓冲区?
或者有人知道如何缩短命令,如上所示?提高性能?

最好的问候阿德里安

最佳答案

性能问题是由 grep 引起的命令检测到它们的输出不是终端设备,因此它们使用 块缓冲 在打印他们的输出时。如果您使用的是 GNU grep ,你可以使用它的 --line-buffered它按行而不是按数据块缓冲。

如果你只想要RSSI值,你可以替换管道grep一个命令 sed命令:

hcidump -a | sed -n 's/[ \t]*RSSI: //p'
-n选项告诉 sed不打印每一行。它在每一行中搜索字符串 RSSI:前面有任意数量的空白字符,并用空字符串替换整个批次。最后 p指示 sed在执行替换后打印该行。

sed命令直接打印到终端设备,它不应阻塞其输出的缓冲区。如果你想让它打印到终端以外的其他东西并且你正在使用 GNU sed ,你可以使用它的 -u, --unbuffered选择

load minimal amounts of data from the input files and flush the output buffers more often



I/O 缓冲的一般信息

当程序将文本打印到输出流时,打印会被缓冲。
有两种类型:
  • 行缓冲 表示在遇到换行符时写入输出。
  • 块缓冲 意味着在等待一定数量的数据之前
    写作。数量取决于内核配置; 4096 字节是
    Linux 的默认设置。

  • 标准流
  • stdin总是块缓冲。
  • stderr是行缓冲的。
  • stdout取决于输出设备:
  • 如果连接到终端设备,则使用行缓冲,
  • 如果不是,则使用块缓冲(例如,stdout 连接到stdin管道中的另一个程序)。


  • 有用的链接

    Grep and OutputBuffering提供
    对这个问题的一个体面的介绍。

    Pádraig Brady 写了一篇很棒的文章来解释内核中发生的事情
    级别: buffering in standardstreams

    Jonathon Perkin 解释了如何为许多程序解决这个问题:
    How to fix stdio buffering

    这个 Unix & Linux Stack Exchange 问题涵盖了许多解决方案:
    Turn off buffering in pipe

    关于pipe - 为什么通过 grep 的输出管道以 block 的形式出现而不是逐行出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37961405/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com