我绝对可以被认为是个新手。我一直在努力做一个多步过滤器,但没有成功.每个片段在自己运行时都会产生结果,但是当我将它们链接在一起时,我什么也得不到。我试过sed_awk,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输出样本(一个“记录”):
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)提供相同的空集结果。我错过了什么简单的事情?
发布于 2016-12-10 00:21:27
好吧,所以我终于想出来了。我认为awk输出并不明显,因为它对输入流进行了某种缓冲/不关闭。从最初的问题开始,我就添加了这个时间戳。
因此,我首先在带sed的时间戳之前加上一个唯一字符(@),然后将其转换为awk,它使用该唯一字符(@)作为记录分隔符,将多行看作一个记录,然后从它读取的字段(现在包括记录头处的时间戳)组合适当的输出。
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发布于 2016-12-08 00:31:00
没有必要将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.txthttps://stackoverflow.com/questions/41029735
复制相似问题