簡體   English   中英

管道sed | awk或awk | sed

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM