Bash 解析或过滤某些文本输出

Bash 解析或过滤某些文本输出,bash,parsing,awk,sed,cut,Bash,Parsing,Awk,Sed,Cut,我有一个输出(一个著名的btmon工具的输出)如下面的示例所示,我需要解析它并以下一种方式从中获取一些信息:如果UUID出现在HCI事件:部分中,并且它等于32f9169f-4feb-4883-ade6-1f0127018db3,则取地址:和RSSI:字段的值,并将它们放在一起,生成新行。比如说, A0:E6:F8:48:EF:78 B7 A0:E6:F8:48:F1:AF B7 下面是一个流或文件,我需要按照描述的方式进行解析: > HCI Event: LE Meta Event (0

我有一个输出(一个著名的
btmon
工具的输出)如下面的示例所示,我需要解析它并以下一种方式从中获取一些信息:如果UUID出现在
HCI事件:
部分中,并且它等于
32f9169f-4feb-4883-ade6-1f0127018db3
,则取
地址:
RSSI:
字段的值,并将它们放在一起,生成新行。比如说,

A0:E6:F8:48:EF:78 B7

A0:E6:F8:48:F1:AF B7

下面是一个流或文件,我需要按照描述的方式进行解析:

> HCI Event: LE Meta Event (0x3e) plen 43                       [hci1] 0.775003
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
        Address type: Random (0x01)
        Address: 27:40:9B:C3:23:7D (Non-Resolvable)
        Data length: 31
        Company: Microsoft (6)
          Data: 010920005a6710df0df2265a4f2c5529c9cf62dfe7427b9f31f2ae
        RSSI: -87 dBm (0xa9)
> HCI Event: LE Meta Event (0x3e) plen 43                       [hci1] 1.524064
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
        Address type: Public (0x00)
        Address: A0:E6:F8:48:EF:78 (Texas Instruments Inc)
        Data length: 31
        Flags: 0x05
          LE Limited Discoverable Mode
          BR/EDR Not Supported
        Company: not assigned (30816)
          Data: ef48f8e6a000
        128-bit Service UUIDs (complete): 1 entry
          32f9169f-4feb-4883-ade6-1f0127018db3
        RSSI: -73 dBm (0xb7)
> HCI Event: LE Meta Event (0x3e) plen 43                       [hci1] 2.375147
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
        Address type: Random (0x01)
        Address: 33:02:7C:4A:D6:FC (Non-Resolvable)
        Data length: 31
        Company: Microsoft (6)
          Data: 01092000de74c964f3b4a3a59fde73f2c0c29651b9532a0e88c4e4
        RSSI: -79 dBm (0xb1)
> HCI Event: LE Meta Event (0x3e) plen 43                       [hci1] 2.876845
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Non connectable undirected - ADV_NONCONN_IND (0x03)
        Address type: Public (0x00)
        Address: A0:E6:F8:48:F1:AF (Texas Instruments Inc)
        Data length: 31
        Flags: 0x05
          LE Limited Discoverable Mode
          BR/EDR Not Supported
        Company: not assigned (44896)
          Data: f148f8e6a000
        128-bit Service UUIDs (complete): 1 entry
          32f9169f-4feb-4883-ade6-1f0127018db3
        RSSI: -73 dBm (0xb7)
> HCI Event: LE Meta Event (0x3e) plen 12                       [hci1] 2.891581
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Scan response - SCAN_RSP (0x04)
        Address type: Random (0x01)
        Address: 6B:AB:CD:7F:B7:65 (Resolvable)
        Data length: 0
        RSSI: -91 dBm (0xa5)

尝试以下awk,并让我知道这是否有帮助

awk '/HCI Event/{A=1;next} /Address:/{val=$2} /32f9169f-4feb-4883-ade6-1f0127018db3/ && A{print val;val=A=""}'   Input_file
现在也添加了一个非线性的解决方案

awk '/HCI Event/{
                        A=1;
                        next
                }
     /Address:/ {
                        val=$2
                }
     /32f9169f-4feb-4883-ade6-1f0127018db3/ && A{
                                                        print val;
                                                        val=A=""
                                                }
    '    Input_file
编辑:2


尝试以下awk,并让我知道这是否有帮助

awk '/HCI Event/{A=1;next} /Address:/{val=$2} /32f9169f-4feb-4883-ade6-1f0127018db3/ && A{print val;val=A=""}'   Input_file
现在也添加了一个非线性的解决方案

awk '/HCI Event/{
                        A=1;
                        next
                }
     /Address:/ {
                        val=$2
                }
     /32f9169f-4feb-4883-ade6-1f0127018db3/ && A{
                                                        print val;
                                                        val=A=""
                                                }
    '    Input_file
编辑:2


此脚本应执行以下操作:

#!/bin/bash
inputfile="path/to/file.txt"
match=false

id=32f9169f-4feb-4883-ade6-1f0127018db3

while read -r line;
do
    if  (! echo ${line} | grep -q "HCI\|Address\|RSSI\|${id}"); then
        continue
    fi
    if echo ${line} | grep -q "> HCI Event:"; then
        if ${match}; then
            echo "${address} ${rssi:3:2}"
        fi
        address=""
        rssi=""
        match=false
        continue
    fi
    if echo ${line} | grep -q "Address: ..:..:..:..:..:.."; then
        address=`echo ${line} | grep -o "..:..:..:..:..:.."`
        continue
    fi
    if echo ${line} | grep -q "RSSI: .*dBm"; then
        rssi=`echo ${line} | grep -o "(0x..)"`
        continue
    fi
    if echo ${line} | grep -q "${id}"; then
        match=true
        continue
    fi
done < "$inputfile"

if ${match}; then
    echo "${address} ${rssi:3:2}"
fi
#/bin/bash
inputfile=“path/to/file.txt”
匹配=错误
id=32f9169f-4feb-4883-ade6-1f0127018db3
而read-r行;
做
如果(!echo${line}grep-q“HCI\| Address\| RSSI\|${id}”);然后
持续
fi
如果echo${line}|grep-q“>HCI事件:;然后
如果${match};然后
回显“${address}${rssi:3:2}”
fi
address=“”
rssi=“”
匹配=错误
持续
fi
如果echo${line}|grep-q“地址:…:…”;然后
地址=`echo${line}| grep-o'。:`
持续
fi
如果echo${line}grep-q“RSSI:.*dBm”;然后
rssi=`echo${line}| grep-o“(0x..)”`
持续
fi
如果echo${line}| grep-q“${id}”;然后
匹配=真
持续
fi
完成<“$inputfile”
如果${match};然后
回显“${address}${rssi:3:2}”
fi

此脚本应完成以下任务:

#!/bin/bash
inputfile="path/to/file.txt"
match=false

id=32f9169f-4feb-4883-ade6-1f0127018db3

while read -r line;
do
    if  (! echo ${line} | grep -q "HCI\|Address\|RSSI\|${id}"); then
        continue
    fi
    if echo ${line} | grep -q "> HCI Event:"; then
        if ${match}; then
            echo "${address} ${rssi:3:2}"
        fi
        address=""
        rssi=""
        match=false
        continue
    fi
    if echo ${line} | grep -q "Address: ..:..:..:..:..:.."; then
        address=`echo ${line} | grep -o "..:..:..:..:..:.."`
        continue
    fi
    if echo ${line} | grep -q "RSSI: .*dBm"; then
        rssi=`echo ${line} | grep -o "(0x..)"`
        continue
    fi
    if echo ${line} | grep -q "${id}"; then
        match=true
        continue
    fi
done < "$inputfile"

if ${match}; then
    echo "${address} ${rssi:3:2}"
fi
#/bin/bash
inputfile=“path/to/file.txt”
匹配=错误
id=32f9169f-4feb-4883-ade6-1f0127018db3
而read-r行;
做
如果(!echo${line}grep-q“HCI\| Address\| RSSI\|${id}”);然后
持续
fi
如果echo${line}|grep-q“>HCI事件:;然后
如果${match};然后
回显“${address}${rssi:3:2}”
fi
address=“”
rssi=“”
匹配=错误
持续
fi
如果echo${line}|grep-q“地址:…:…”;然后
地址=`echo${line}| grep-o'。:`
持续
fi
如果echo${line}grep-q“RSSI:.*dBm”;然后
rssi=`echo${line}| grep-o“(0x..)”`
持续
fi
如果echo${line}| grep-q“${id}”;然后
匹配=真
持续
fi
完成<“$inputfile”
如果${match};然后
回显“${address}${rssi:3:2}”
fi
awk解决方案:

awk -v uid="32f9169f-4feb-4883-ade6-1f0127018db3" '/Address:/{ addr=$2 }
     /UUIDs/ && (getline nl > 0) && nl~uid{ uuid=nl; f=1 }
     /RSSI/{ if(f) { rssi=toupper(substr($4,4,2)); print addr,rssi; f=0 } }' file
输出:

A0:E6:F8:48:EF:78 B7
A0:E6:F8:48:F1:AF B7
awk解决方案:

awk -v uid="32f9169f-4feb-4883-ade6-1f0127018db3" '/Address:/{ addr=$2 }
     /UUIDs/ && (getline nl > 0) && nl~uid{ uuid=nl; f=1 }
     /RSSI/{ if(f) { rssi=toupper(substr($4,4,2)); print addr,rssi; f=0 } }' file
输出:

A0:E6:F8:48:EF:78 B7
A0:E6:F8:48:F1:AF B7


这只给出了
A0:E6:F8:48:EF:78 A0:E6:F8:48:F1:AF
而没有RSSI@RuslanGerasimov,现在请检查我的更新,EDIT2,并让我知道您是否需要此输出。这给了:
A0:E6:F8:48:EF:78 RSSI:-73 dBm(0xb7)A0:E6:F8:48:F1:AF RSSI:-73 dBm(0xb7)
一点关于RSSI部分。我认为kee[edit2无论如何也是可能的,即使你做了edit3。这个edit2现在应该可以工作了,很抱歉忽略了RSSI部分,现在检查一下。如果我们需要根据[hci]字段输出到不同的文件,你能建议对此进行修改吗?所以如果我有[hci0],那么所有这些实例都将转到文件0,所有[hci1]转到文件1等等?但是主输出(第一个版本)也应该保留。谢谢。这只提供了
A0:E6:F8:48:EF:78 A0:E6:F8:48:F1:AF
RSSI@RuslanGerasimov,请立即检查我的更新,EDIT2,并让我知道您是否需要此输出。这给出:
A0:E6:F8:48:EF:78 RSSI:-73 dBm(0xb7)A0:E6:F8:48:F1:AF RSSI:-73 dBm(0xb7)
对于RSSI部分来说,稍微多一点。我认为kee[edit2无论如何也是可能的,即使你制作了edit3。这个edit2现在应该可以工作了,很抱歉忽略了RSSI部分,现在检查一下。如果我们需要根据[hci]输出到不同的文件,你能建议对此进行修改吗字段,那么如果我有[hci0],那么所有这样的实例都会转到file0,所有[hci1]都会转到file1,依此类推?但是主输出(第一个版本)也应该保留。谢谢../filter\u script.sh:line 24:unexpected token附近的语法错误
done./filter\u script.sh:line 24:
done<“$inputfile”“@RuslanGerasimov抱歉,忘记了
;do
语句。编辑了代码。现在运行!谢谢你。它给出了:A0:E6:F8:48:F1:AF(0xc1),可能没有括号吗?另一件事是你的脚本运行非常慢,就像每行(每个地址)一秒钟一样-这可以解决吗?@RuslanGerasimov增加了一些速度改进,rssi现在只显示值。
/filter2_script.sh:line 33:test.txt:没有这样的文件或目录。/filter2_script.sh:line 37:在查找匹配的```时出现意外的EOF。/filter2_script.sh:line 38:语法错误:意外的文件结尾
/filter_script.sh:l第24行:意外标记附近的语法错误
done./filter\u script.sh:24行:
done<“$inputfile”@RuslanGerasimov抱歉,忘记了
;do
语句。编辑了代码。立即运行!谢谢。它给出了:A0:E6:F8:48:F1:AF(0xc1)还有一件事是你的脚本运行得非常慢,就像每行(每个地址)一秒钟一样-这可以解决吗?@RuslanGerasimov增加了一些速度改进,rssi现在只显示值。
/filter2_script.sh:line 33:test.txt:没有这样的文件或目录。/filter2_script.sh:line 37:在查找匹配的```时出现意外的EOF。/filter2_script.sh:line 38:语法错误:意外的文件结尾
能否请您提出建议如果我们需要根据[hci]字段输出到不同的文件,则需要对此进行修改。因此,如果我有[hci0],则所有此类实例都将转到file0,所有[hci1]都将转到file1,依此类推。但主输出(第一个版本)也应保留在