[英]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.