繁体   English   中英

管道sed | awk或awk | sed

[英]piping sed | awk or awk | sed

我绝对可以认为是sed / awk新手。 我一直在做一个多步骤的过滤器,但没有成功。 每个段单独运行都会产生结果,但是当我将它们链接在一起时,我什么也没得到。 我已经尝试过sed | awk,sed | sed | sed,awk | awk。 他们都失败了,所以我认为这是除了我以外的所有人都知道的东西。

数据是多行文本块,其中每个块都可以视为一条记录(因此,“>”定界符)。 在仅过滤到ADV_NONCONN块之后,我想然后将文本块过滤为仅包含“ bdaddr”或“ RSSI”的行。 据我所知,我需要进行单独的操作。

sudo hcidump | awk 'BEGIN {RS=">"} /ADV_NONCONN/' | sed -n -e "/bdaddr/p" -e "/RSSI/p" > log.txt

hcidump输出样本(一个“记录”):

HCI Event: LE Meta Event (0x3e) plen 43
    LE Advertising Report
      ADV_NONCONN_IND - Non connectable undirected advertising (3)
      bdaddr 0C:F3:EE:0D:70:89 (Public)
      Flags: 0x06
      Unknown type 0xff with 26 bytes data
      RSSI: -62

运行相反的运算(首先是sed部分,然后是awk),得出的结果相同。 我错过了什么简单的事情?

不需要通过awk来传递sed 只需在awk命令中添加其他条件:

sudo hcidump | awk -v RS=">" '/ADV_NONCONN/ {
    n = split($0, line, /\n/);
    for (i = 1; i <= n; i++) {
        if (line[i] ~ /bdaddr|RSSI/) print line[i];
    }
}' > log.txt

好的,所以我最终弄清楚了。 我相信awk输出不是绝对可以通过管道传输,这是因为它对输入流进行了某种缓冲/不关闭。 从最初的问题开始,我从hcidump中添加了时间戳。

因此,首先我在带有sed的时间戳之前添加一个唯一字符(@),然后将其通过管道传送到awk,awk使用该唯一字符(@)作为记录定界符将多行视为一条记录,过滤出我想要的记录(ADV_NONCONN)然后从其读取的字段(现在包括记录开头的时间戳)中组合适当的输出。

sudo hcidump -t | sed -n '/HCI Event/{s/^/@/};p' | awk 'BEGIN {RS="@"} {-F '[\n]'} /ADV_NONCONN/ {print $1 " " $2 ", " $23 ", " $35}' > a.txt

原始问题的解决方案是:

sudo hcidump | awk 'BEGIN {RS=">"} {-F '[\n]'} /ADV_NONCONN/ {print $20 ", " $32}' > a.txt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM