首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管系sed _ awk或awk _ sed

管系sed _ awk或awk _ sed
EN

Stack Overflow用户
提问于 2016-12-08 00:25:12
回答 2查看 1.6K关注 0票数 0

我绝对可以被认为是个新手。我一直在努力做一个多步过滤器,但没有成功.每个片段在自己运行时都会产生结果,但是当我将它们链接在一起时,我什么也得不到。我试过sed_awk,awk_sed,sed_sed,awk\awk。他们都失败了,所以我想这是每个人都知道的,除了我。

数据是多行文本块,其中每个块可以被视为记录(因此成为">“分隔符)。在我们筛选到仅仅ADV_NONCONN块之后,我想将文本块过滤到只包含"bdaddr“或"RSSI”的行。据我所知,我需要一个单独的操作来做到这一点。

代码语言:javascript
复制
sudo hcidump | awk 'BEGIN {RS=">"} /ADV_NONCONN/' | sed -n -e "/bdaddr/p" -e "/RSSI/p" > log.txt

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

代码语言:javascript
复制
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)提供相同的空集结果。我错过了什么简单的事情?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-10 00:21:27

好吧,所以我终于想出来了。我认为awk输出并不明显,因为它对输入流进行了某种缓冲/不关闭。从最初的问题开始,我就添加了这个时间戳。

因此,我首先在带sed的时间戳之前加上一个唯一字符(@),然后将其转换为awk,它使用该唯一字符(@)作为记录分隔符,将多行看作一个记录,然后从它读取的字段(现在包括记录头处的时间戳)组合适当的输出。

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

原问题的解决办法是:

代码语言:javascript
复制
sudo hcidump | awk 'BEGIN {RS=">"} {-F '[\n]'} /ADV_NONCONN/ {print $20 ", " $32}' > a.txt
票数 -1
EN

Stack Overflow用户

发布于 2016-12-08 00:31:00

没有必要将awk输送到sed。只需在awk命令中添加附加条件:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41029735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档