Преобразование / proc / cpuinfo в JSON в linux bash

Можно использовать следующий однострочный код для вставки одной строки или нескольких строк в данное местоположение в файле в Вас случай перед 'VirtualHost'. Код в основном ищет имя файла (это могло быть *. *, если Вы хотите вставить тексты во все файлы) в рамках данного каталога и его подкаталогов. В найденных файлах это ищет шаблон 'VirtualHost'. После того, как это нашло шаблон, это заменяет его firstline\nsecondline\notherlines\n\VirtualHost. Обратите внимание, что 'VirtualHost' является частью текста для замены, иначе мы будем потеря это.

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'
5
06.06.2015, 02:16
3 ответа

Ну, для простого подхода, вы могли бы просто сделать:

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 / cpuinfo . Однако он также печатает любые пустые строки в файле. Чтобы избежать этого, сначала труба через :

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

или, только распечатайте, если строка содержит : :

perl -F: -alne 's/.*:.*/"$F[0]" : "$F[1]"/ && print' /proc/cpuinfo 
3
27.01.2020, 20:36
sed -n '/./s/ *\(\( *[^:[:blank:]]\)*\)[^:]*\(:*\)/"\1"\3/gp' /proc/cpuinfo

... работает в SED . С ярлыками GNU вы можете написать практически такое же утверждение, как:

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

Это своего рода хромой (потому что я мог бы сделать лучше с несколькими нажатиями клавиш и JW ) , но я играл Вокруг W / 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

I думаю Выход - это что-то близкое к действительности. Я сфотографировал, потому что я никогда не смогу получить вкладки, чтобы выстроить в окне браузера, поскольку они делают в окне терминала.

Большая часть табличек мошенничество в любом случае - PR PR делает флаги Reformatting через GNU команду E , а для остальных я сохраняющую столько из первоначально отформатированного вывода, как я мог. Например, потому что мне пришлось вставить два символа - двойные кавычки - вокруг членов имени, когда я также вставляю ведущую таблицу, которую я делаю 1 фактическую вкладку, за которой следует шесть пробелов в нефтяной попытке при сохранении текущей положения вкладки.

Вот первый хэш:

enter image description here

3
27.01.2020, 20:36

Моя версия:

#!/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 );

Предполагается между каждым определением ЦП есть пустая строка.

2
27.01.2020, 20:36

Теги

Похожие вопросы