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 

그러면 행이 배열 :로 분할되고( 분할할 문자를 설정하고 자동 분할이 켜짐 ) 인용문의 각 면이 인쇄됩니다. 한 줄에 두 개 이상 이 있으면 깨지지 만 그런 일은 일어나지 않을 것 같습니다 . 그러나 파일의 모든 빈 줄도 인쇄됩니다. 이를 방지하려면 먼저 파이프하십시오 .@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다시 포맷했으며 원래 포맷된 출력을 최대한 많이 유지했습니다. 예를 들어 이름 멤버 주위에 두 개의 문자(큰따옴표)를 삽입해야 하기 때문에 선행 탭도 삽입할 때 실제 탭 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 정의 사이에 빈 줄이 있다고 가정합니다.

관련 정보