2016-12-08 23 views
0

私は間違いなくsed/awk初心者とみなすことができます。私は、成功せずにマルチステップフィルタを行うように取り組んできました。各セグメントは、それ自身の上で実行されたときに結果をもたらしますが、それらを一緒にチェーン化すると何も得られません。私はsedを試しました| awk、awk | sed、sed | sed、awk | awk。彼らはすべてが失敗するので、私はそれが誰でもよく知られているものだと仮定しています。piping sed | awkまたはawk | sed

データは複数行のテキストブロックで、各ブロックはレコード(したがって ">"デリミタ)として扱うことができます。私たちは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は)同じ空集合の結果を与えます。どんな単純なことを私が逃したのですか?

+2

それは、ほとんどsed' 'へawk''パイプに必要なことはありませんawk構文は通常理解しやすくなります。 – Barmar

+0

私はあなたにいくつかのフィードバックを与えることができます:あなたの質問とあなた自身の答えの両方が気晴らしのポイントになっています - それらをより簡潔にし、焦点を合わせることを検討してください。 – mklement0

+0

また、新参者へのいくつかの標準的なアドバイス:答えがあなたの問題を解決した場合は、その横の大きいチェックマーク(✓)をクリックして受諾し、オプションで上向きに投票します(上向き投票は少なくとも15評判ポイントが必要です)。 他の回答が有益だった場合は、投票してください。受諾およびアップ投票は将来の読者に役立ちます。関連するヘルプセンターの記事(http://stackoverflow.com/help/someone-answers)を参照してください。質問にまだ完全に回答していない場合は、フィードバックを提供してください。最高の解決策を自分で見つけたと思ったら、それを回答として投稿し、自己受け入れます。 – mklement0

答えて

-1

OKをので、私は最終的にそれを考え出した:ちょうどawkコマンドで追加条件を追加します。私はawkの出力がある種のバッファリング/入力ストリームでやっているのではない閉じ込めのために非常にパイプ可能ではないと信じています。元の質問以来、私はhcidumpからタイムスタンプを追加しました。

最初に、sedを使ってタイムスタンプの前にユニークな文字(@)を付けてから、複数の行をその一意の文字(@)をレコード区切り文字として使用して1つのレコードとして扱う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 

元の質問を解決するには、次のようになります。awk`はsed`が行うことができます `というほとんどの事を行うことができます`以来

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

downvote人:少なくとも理由を提供する。 – Steven2163712

3

awksedにパイプする必要はありません。

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 
+0

私は細かいことを忘れてしまったと思います(元の質問に追加します)。各レコードawkプロセスは、複数行のテキストブロックです。 awkフィルタをADV_NONCONNを含むレコードに渡した後、bdaddrまたはRSSIのいずれかを含むレコードブロック内の行のみにフィルタリングする必要があります。あなたのawkスニペットも私に空のセットを与えます。 –

+0

ブロック内の行を 'awk'でループするように改訂しました。 – Barmar

+0

しかし、今はこれがあなたの元の試みほど単純ではないことを認めます。なぜそれがうまくいかなかったのか分かりません。 – Barmar

関連する問題