Как сравнить вывод текущего процесса?

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

Итак, теперь я хочу сравнить выходной поток, который печатается на консоль с текстовым файлом предыдущего золотого хода. Если есть разница с выходом по сравнению с текстовым файлом, симуляция должна быть прекращена автоматически.

Для тестирования требуется много времени. Меня интересует только первая ошибка в текущем запуске, поэтому я могу сэкономить время ожидания до завершения выполнения, чтобы сравнить оба выхода.

1
задан 28 October 2014 в 16:34

2 ответа

Вы можете использовать diff util.

Предположим, у вас есть ваш золотой файл, а другой, который я изменил.

У меня нет вашей программы, поэтому я написал это:

#!/bin/bash
    while read -r line; do
        echo "$line";
        sleep 1;
    done < bad_file

Он читает из ваш файл (bad_file) и выводит строку за строкой каждую секунду.

Теперь запускаем этот скрипт и перенаправить его на файл log.

$ simulate > log &

Также я написал скрипт проверки:

#!/bin/bash

helper(){
    echo "This script takes two file pathes as arguments."
    echo "$0 path/to/file1 path/to/file2"
}

validate_input(){
    if [[ $# != 2 ]]; then 
        helper
        exit 1
    fi

    if [[ ! -f "$1" ]]; then
        echo "$1" file is not exist.
        helper
        exit 1
    fi
    if [[ ! -f "$2" ]]; then
        echo "$2" file is not exist.
        helper
        exit 1
    fi
}

diff_files(){
# As input takes two file and check
# difference between files. Only checks
# number of lines you have right now in
# your $2 file, and compare it with exactly
# the same number of lines in $1
    diff -q -a -w <(tail -n+"$ULINES" $1 | head -n "$CURR_LINE") <(tail -n+"$ULINES" $2 | head -n "$CURR_LINE")
}

get_curr_lines(){
# count of lines currenly have minus ULINES
    echo "$[$(cat $1 | wc -l) - $ULINES]"
}

print_diff_lines(){
    diff -a -w --unchanged-line-format="" --new-line-format=":%dn: %L" "$1" "$2" | grep -o ":[0-9]*:" | tr -d ":"
}

ULINES=15 # count of first unused lines. How many first lines to ignore

validate_input "$1" "$2"
CURR_LINE=$(get_curr_lines "$2") # count of lines currenly have minus ULINES

if [[ $CURR_LINE < 0 ]];then
    exit 0
fi

IS_DIFF=$(diff_files "$1" "$2")
if [[ -z "$IS_DIFF" ]];then
    echo "Do nothing if they are the same"
else
    echo "Do something if files already different"
    echo "Line number: " `print_diff_lines "$1" "$2"`
fi

Не забудьте сделать его исполняемым chmod +x checker.sh. [!d9 ]

Этот скрипт принимает два аргумента. Первый аргумент - это путь к вашему золотому файлу, второй путь аргумента к вашему файлу журнала.

$ ./checker.sh path_to_golden path_to_log

Эта контрольная сумма подсчитывает количество строк, которые у вас есть прямо сейчас в файле log, и сравнивайте их с такое же количество строк в golden_file.

Вы запускаете проверку каждый раз и выполняете команду kill при необходимости

Если вы хотите, чтобы вы могли писать функцию bash для запуска checker.sh каждую секунду :

$ chk_every() { while true; do ./checker.sh $1 $2; sleep 1; done; }

Часть предыдущего ответа о diff

Вы можете сравнивать их по строкам в виде текстового файла

Из [ f17]

NAME
   diff - compare files line by line

   -a, --text
          treat all files as text

   -q, --brief
          report only when files differ

   -y, --side-by-side
          output in two columns

Если мы сравним наши файлы:

$ diff -a <(tail -n+15 file1) <(tail -n+15 file2)

Мы увидим этот результат:

2905c2905
< Solutions: 0.686669
---
> Solutions: 0.686670
2959c2959
< Solutions: 0.279124
---
> Solutions: 0.279125
3030c3030
< Solutions: 0.539016
---
> Solutions: 0.539017
3068c3068
< Solutions: 0.308278
---
> Solutions: 0.308279

Показывает линию, которая отличается

И вот окончательная команда, я предполагаю, что вы не хотите проверять первые 15 строк:

$ diff -y -a <(tail -n+15 file1) <(tail -n+15 file2)

Он покажет вам все различия в двух столбцах. Если вы только хотите знать, есть ли какие-то различия, используйте это:

$ diff -q -a <(tail -n+15 file1) <(tail -n+15 file2)

Он ничего не печатает, если файлы одинаковы

3
ответ дан 24 May 2018 в 02:22
  • 1
    Это не сравнивает вывод при его запуске, и это не останавливает программу, если она отличается. – MadMike 28 October 2014 в 12:47
  • 2
    Здесь у нас есть только один текстовый файл. Я пытаюсь сравнить его с текущим тестированием на терминале. Создание второго текстового файла для сравнения с использованием diff не будет полезно для меня, так как каждый прогон занимает 20 минут. Я хочу завершить текущее выполнение, как только получаю несоответствие с первым текстовым файлом. – Insanely curious 28 October 2014 в 12:49
  • 3
    @ c0rp, можете ли вы сделать это немного ясно? Что вы подразумеваете под test3? и должен ли я заменить $ 1 $ 2 на мой путь к файлу? – Insanely curious 28 October 2014 в 13:53
  • 4
    Это потрясающе! Это очень поможет. Извините меня, если я жадна, но можем ли мы сделать этот скрипт периодически в цикле, а не вручную выполнять его каждый раз? Как только я вижу разницу, я могу закончить цикл. – Insanely curious 28 October 2014 в 14:09
  • 5
    Это очень помогло! Большое вам спасибо @ c0rp! Кто-то, пожалуйста, поддержите и. У меня недостаточно очков для голосования. – Insanely curious 28 October 2014 в 15:31

Я понятия не имею, насколько сложны ваши входные данные, но вы можете использовать что-то вроде awk для чтения каждой строки, когда она приходит, и сравнивать ее с известным значением.

$ for i in 1 2 3 4 5; do echo $i; sleep 1; done | \
  awk '{print "Out:", $0; fflush(); if ($1==2) exit(0)}'
Out: 1
Out: 2

In в этом случае я подаю поток с задержкой по времени и awk работает до тех пор, пока первая переменная на входе (единственная переменная здесь) не будет равна 2, а затем выйдет и при этом остановит поток.

0
ответ дан 24 May 2018 в 02:22
  • 1
    @MadMike мой вывод находится в текстовом файле, подобном этому pastebin.ubuntu.com/8716346 . Я хочу, чтобы мой поток времени выполнения сравнивался со строками в этом текстовом файле. Я могу закончить, как только будет несоответствие. – Insanely curious 28 October 2014 в 12:24

Другие вопросы по тегам:

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