Как манипулировать файлами времени и машинописью, созданными командой `script`? - PullRequest
1 голос
/ 25 сентября 2019

Часто с помощью script и scriptreplay мне интересно, существуют ли инструменты для манипулирования результирующими файлами.

Sample (От Как профилировать сценарий командной оболочки bash при медленном запуске? ):

script -t script.log 2>script.tim -c 'bash -x -c "
    for ((i=3;i--;));do sleep .1;done

    for ((i=2;i--;)) ;do
        tar -cf /tmp/test.tar -C / bin
        gzip /tmp/test.tar
        rm /tmp/test.tar.gz
    done
"'

Тогда есть два файла:

-rw-r--r-- 1 user  user  472 Sep 25 10:44 script.log
-rw-r--r-- 1 user  user  213 Sep 25 10:44 script.tim

И я могу воспроизвести сценарий:

scriptreplay --timing script.tim --typescript script.log 10

с помощью 10 как делитель времени выполнения для ускорения воспроизведения в 10 раз или

scriptreplay --timing script.tim --typescript script.log .1

для замедления воспроизведения в 10 раз.

Интересно, существуют ли такие инструменты, как:

Ну, оттуда:

cut -d \  -f1 <script.tim | xargs  | tr \  + | bc
3.616809

выдаст общее время выполнения или если строк слишком много:

cut -d \  -f1 <script.tim | xargs  | tr \  + | bc | xargs  | tr \  + | bc
3.616809

и

cut -d \  -f2 <script.tim | xargs  | tr \  + | bc
366
sed '1d;$d' script.log |wc -c
367

до проверьте общий размер выходного скрипта .(sed отбросить первую и последнюю строки журнала, которые содержат: Script started on Wed Sep 25 14:40:20 2019 и Script done on Wed Sep 25 14:40:23 2019.)

Затем вычисление размера журнала (указателя) в какое-то время :

perl -e 'my ($l,$t,$p)=(0,0,0); # line totTime pos
    open FH,"<".$ARGV[0] || die;
    while (<FH>) {
        my ($d,$n)=split" "; # duration numBytes
        $l++;
        $t+=$d;
        $p+=$n;
        $t>=${ARGV[1]} && do {
            print $l." ".$p."\n";
            exit 0;
        };
    };' script.tim  1.2
12 216

Строка 12 в файле синхронизации (head -n 12) и позиция байта 216 в файле машинописи (head -c 216).

Или, если я ищу истекшее время до какой-то строки :

grep -ob 'tar.*test' script.log 
217:tar -cf /tmp/test
320:tar -cf /tmp/test

perl -e 'my ($l,$t,$p)=(0,0,0);open FH,"<".$ARGV[0] || die;while (<FH>) { 
    my ($d,$n)=split" ";$l++;$t+=$d;$p+=$n;$p>=${ARGV[1]} && do {
      print $l." ".$p."\n";exit 0;};};' script.tim  217
17 228

head -n 17 script.tim | cut -d \  -f1 | xargs | tr \  + | bc
1.091276

Что-то легче!?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...