Linux 管道自紧或自紧

Linux 管道自紧或自紧,linux,awk,sed,pipe,Linux,Awk,Sed,Pipe,我绝对可以被认为是sed/awk新手。我一直在努力做一个多步骤过滤器,但没有成功。每个片段单独运行时都会产生结果,但当我将它们链接在一起时,却一无所获。我试过sed | awk,awk | sed,sed | sed,awk | awk。他们都失败了,所以我想这是除了我以外所有人都知道的事情 数据是多行文本块,其中每个块都可以被视为一条记录(因此使用“>”分隔符)。在我们过滤到ADV_noncn块之后,我想过滤掉文本块,只过滤到包含“bdaddr”或“RSSI”的行。据我所知,我需要通过管道进行

我绝对可以被认为是sed/awk新手。我一直在努力做一个多步骤过滤器,但没有成功。每个片段单独运行时都会产生结果,但当我将它们链接在一起时,却一无所获。我试过sed | awk,awk | sed,sed | sed,awk | awk。他们都失败了,所以我想这是除了我以外所有人都知道的事情

数据是多行文本块,其中每个块都可以被视为一条记录(因此使用“>”分隔符)。在我们过滤到ADV_noncn块之后,我想过滤掉文本块,只过滤到包含“bdaddr”或“RSSI”的行。据我所知,我需要通过管道进行单独的操作

sudo hcidump | awk 'BEGIN {RS=">"} /ADV_NONCONN/' | sed -n -e "/bdaddr/p" -e "/RSSI/p" > log.txt
hcidump输出样本(一条“记录”):


运行反向(先运行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
sudo hcidump|awk-v RS=“>”/ADV_noncn/{
n=拆分($0,行,/\n/);

对于(i=1;i无需将
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
sudo hcidump|awk-v RS=“>”/ADV_noncn/{
n=拆分($0,行,/\n/);

对于(i=1;iOK,所以我最终找到了答案。我认为awk输出不完全可以通过管道传输,因为它对输入流进行了某种缓冲/不关闭。从最初的问题开始,我添加了hcidump中的时间戳

因此,首先我用sed在时间戳之前预加一个唯一字符(@),然后将其传递到awk,awk使用该唯一字符(@)作为记录分隔符将多行视为一条记录,过滤到我想要的记录(ADV_noncn),然后从它读取的字段中汇编适当的输出(现在在记录的头部包括时间戳)

原来问题的解决办法是:

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

好的,所以我最终找到了答案。我认为awk输出不完全是管道式的,因为它对输入流进行了某种缓冲/不关闭。从最初的问题开始,我添加了hcidump中的时间戳

因此,首先我用sed在时间戳之前预加一个唯一字符(@),然后将其传递到awk,awk使用该唯一字符(@)作为记录分隔符将多行视为一条记录,过滤到我想要的记录(ADV_noncn),然后从它读取的字段中汇编适当的输出(现在在记录的头部包括时间戳)

原来问题的解决办法是:

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

几乎不必把代码<代码> AWK < /代码>改为<代码> SED,因为<代码> AWK<代码>可以做大部分的事情,<代码> SED可以做,并且 AWK语法通常更容易理解。请允许我给你一些反馈:你的问题和你自己的答案都是闲聊到分心点-请考虑制作。另外,给新来者的一些标准建议是:如果一个答案解决了你的问题,请点击大复选标记接受它(✓) 在它旁边,也可以选择向上投票(向上投票需要至少15个信誉点)。如果您发现其他答案有帮助,请向上投票。接受和向上投票有助于未来的读者。请参阅。如果您的问题尚未完全回答,请提供反馈。如果您认为您自己找到了最佳解决方案,请将其发布为答案并自我接受。几乎没有必要将
awk
发送到
sed >“代码> AWK</代码>可以完成大部分的事情, SED可以做到,并且 AWK语法通常更容易理解。请允许我给你一些反馈:你的问题和你自己的答案都是闲聊到分散注意力的地方-请考虑使它们更加简洁和集中。另外,对新来者提出一些标准建议:如果答案解决了您的问题,请单击大复选标记接受答案(✓) 在它旁边,也可以选择向上投票(向上投票需要至少15个信誉点)。如果您发现其他答案有帮助,请向上投票。接受和向上投票有助于未来的读者。请参阅。如果您的问题尚未完全回答,请提供反馈。如果您认为您自己找到了最佳解决方案,请将其发布为答案并自我接受。我想我遗漏了一点细节(我将添加到原始问题中)。每个记录awk进程都是一个多行文本块。在awk筛选到包含ADV_uncon的记录后,我只需要筛选到该记录块中包含bdaddr或RSSI的行。您的awk代码片段也给了我空集。我已将其修改为在
awk
中循环到块中的行。但我承认,现在没有你最初尝试的那么简单,我不知道为什么它不起作用。就是这样。谢谢。我仍然不知道为什么我不能通过管道传输awk的输出,然后用sed处理它,但至少在这个例子中,这并不重要。干杯。你不需要使用
split()
要创建一个数组,只需设置
-F'\n'
并在字段上循环。我想我遗漏了一点细节(我将补充原始问题)。每个记录awk进程都是一个多行文本块。在awk筛选到包含ADV_uncon的记录后,我只需要筛选到该记录块中包含bdaddr或RSSI的行。您的awk代码片段也给了我空集。我已将其修改为在
awk
中循环到块中的行。但我承认,现在没有你最初尝试的那么简单,我不知道为什么它不起作用。就是这样。谢谢。我仍然不知道为什么我不能用管道传输awk的输出,然后用sed处理它,但至少在这个例子中,这并不重要。干杯。你不需要使用
split()
来创建数组,j