Linux ターミナルはファイルに出力されますが、フィルターされていますか?

Linux ターミナルはファイルに出力されますが、フィルターされていますか?

類似トピック:端末出力をテキストファイルに継続的に書き込む

Ubuntu Mate に USB RF 受信機があり、次のようなデータを端末に送信します。

b';311;'

b';312;'

b';312;00000000;036;552;1014f49;3020;2659;6294;1049;2659;S;'

b';313;'

最も長いものだけを保存できますか? できれば「b';xxx」なしで保存しますが、後で解析することもできます。

答え1

RFデータをフィルタリングできるプログラムにパイプし、ファイルに出力する必要があります。

cat | ./filter.pl < /dev/ttyusb0 >> output.file

filter.plご想像のとおり、フィルタリングは次のようになります。

#!/usr/bin/env perl 

# disable buffering    
$|=1;

$re = qr/
  ^         # Match start of line
  b';       # b quote semi colon
  \d+       # Match one or more digits
  ;         # semi colon
  (.+)      # One or more characters, store the match as $1
  ;'        # semi colon, single quote
/x;

while (<>) {
  print "$1\n" if $_ =~ $re
}

正規表現はフォーマットと一致し、最後の 2 つのセミコロンの間の文字を抽出します。

答え2

ではsed、基本的な正規表現を使用します:

whatever | sed -n "s/^b';[0-9]\{3\}];\(.\+\);'/\1/p" >> output_file

ではsed、拡張正規表現を使用します:

whatever | sed -n "s/^b';[0-9]{3};(.+);'/\1/p" >> output_file

関連情報