Linux bashで/proc/cpuinfoをJSONに変換する

Linux bashで/proc/cpuinfoをJSONに変換する

cat /proc/cpuinfoaの全項目をJSONに変換したいと思います"key" : "value"

可能ですか?私は\n各行を取得できるようにしたいので、文字列分解を使用しようとしています。その後、各行を使用できます:

しかし、改行文字は一貫性のない配列を生成するようです。

答え1

簡単な方法で次のようにすることができます。

sed 's/\(.*\)\t:\(.*\)/"\1" : "\2"/' /proc/cpuinfo 

これにより、タブの前のすべての項目と一致し、コロンが続き、として保存され、\1コロンの後のすべての項目が一致してとして保存されます\2。代わりに、周囲に引用符があります。

ただし、これにより次のような結果が得られます。

"fpu    " : " yes"
power management:

タブの前に余分な空白がある項目には空白が含まれ、空の項目は無視されます。このバージョンのPerlは、次の問題を正しく処理します。

perl -F: -alpe 's/.*/"$F[0]" : "$F[1]"/' /proc/cpuinfo 

これにより、行が配列:に分割され(分割する文字を設定して自動分割がオンになり)、引用符の各面が印刷されます。 1行に2つ以上があると割れますが、そんなことは起こらないようです。ただし、ファイル内のすべての空白行も印刷されます。これを避けるためには、まずパイプしてください。@F-F-a@F:/proc/cpuinfogrep

grep . /proc/cpuinfo | perl -F: -alpe 's/.*/"$F[0]" : "$F[1]"/' /proc/cpuinfo 

または、行に以下が含まれている場合にのみ印刷してください:

perl -F: -alne 's/.*:.*/"$F[0]" : "$F[1]"/ && print' /proc/cpuinfo 

答え2

sed -n '/./s/ *\(\( *[^:[:blank:]]\)*\)[^:]*\(:*\)/"\1"\3/gp' /proc/cpuinfo

sed... GNUショートカットを使用すると、ほぼ同じステートメントを作成できます。たとえば、次のようになります。

sed -En 's/ *(( ?[^ :\t])+)\s*(:?)/"\1"\3/gp' /proc/cpuinfo

これは少し悪いです。(数回のキー入力でより良いことができるからですjw、でも遊んでいますsed...

set '   ' $'\\\n' $'\n' '      '
sed -En "\$c$2$1}$2]${3}1ccpus$1=$1[$2$1{$3/^$/c$2$1},$2$1{
        s/ *(( ?[^ :\t])+)(\s*:\s*)?\s*/\"\1\"\3/g
        s/\"(([yn]).s?|([0-9]+))\"$/\3false\2true/
        s/falsey|ntrue|([0-9])f\w+$/\1/
        /^.flags./{
                s/\s*:\s*/$1=$1[/;h
                s/.*\t.//;x;s/(.*\t.).*/\1/;x
                s/ /\",$2\"/g
                s/^/pr -to24 -a4 <<''$2/e;H;x
                s/$/$2$1$1]/
};      s/.*/$1$4&,/p" /proc/cpuinfo

考える出力はほぼ有効です。端末ウィンドウと同じようにブラウザウィンドウでタブを整列できないようで、写真を撮りました。

とにかく、ほとんどのフォームは詐欺されています。prそれとも詐欺ですか?バナーGNUコマンドと残りの部分でsed e再フォーマットし、元のフォーマットされた出力をできるだけ維持しました。たとえば、名前メンバーの周囲に2つの文字(二重引用符)を挿入する必要があるため、前のタブも挿入するときに実際のタブ1つとスペース6つに設定して、おおよその現在のタブ停止位置を維持したいとします。

最初のハッシュは次のとおりです。

ここに画像の説明を入力してください

答え3

私のバージョン:

#!/usr/bin/env perl

use strict;
use warnings;

use JSON;
use Storable qw(dclone);

my ( %h, @cpu );

while (<>) {
    chomp;

    if (m/^$/o) {
        push @cpu, dclone( \%h );
        undef %h;
        next;
    }

    my ( $k, $v ) = split /\s*:\s*/, $_, 2;

    if ( !defined $v or $v eq '' ) { $h{$k} = undef }
    elsif ( $k eq 'flags' )        { $h{$k} = [ split /\s/, $v ] }
    elsif ( $v =~ /^\d+$/o )       { $h{$k} = int ($v) }
    elsif ( $v eq 'yes' )          { $h{$k} = \1 }
    elsif ( $v eq 'no' )           { $h{$k} = \0 }
    else                           { $h{$k} = $v }
}

print JSON->new->pretty->encode( \@cpu );

これは、各CPU定義間に空行があると仮定します。

関連情報