Извлечение определенного текста из конца пользовательского (текстового) файла журнала с помощью bash - PullRequest
1 голос
/ 19 июня 2019

Мне нужны только самые последние пять цифр (которые находятся внизу файла, в которых могут быть сотни таких групп)

{Previous entries would be above, perhaps hundreds of similar groups....}

[June 18, 2019, 12:37 pm Europe/Madrid +0200]
--------------------------------------------------

Added: 2
Modified: 3
Deleted: 1
Excluded: 2
Total Time: 5.09

[June 19, 2019, 12:37 pm Europe/Madrid +0200]
---------------------------------------------------

Added: 3
Modified: 0
Deleted: 2
Excluded: 1
Total Time: 6.18

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

Вывод, который я ищу:

echo "<added>3</added>";
echo "<modified>0</modified>";
echo "<deleted>2</modified>";
echo "<excluded>1</excluded>";
echo "<total>6.18</total>";

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

echo $file | awk -F'Added:' '{print $2}'

Надеюсь, это окажется полезным.

Ответы [ 2 ]

1 голос
/ 19 июня 2019
$ awk -F'[: ]+' '
    NF { tags[++numTags]=tolower($1); vals[numTags]=$NF; next }
    { numTags=0 }
    END {
        for (tagNr=1; tagNr<=numTags; tagNr++) {
            printf "echo \"<%s>%s</%s>\";\n", tags[tagNr], vals[tagNr], tags[tagNr]
        }
    }
' file
echo "<added>3</added>";
echo "<modified>0</modified>";
echo "<deleted>2</deleted>";
echo "<excluded>1</excluded>";
echo "<total>6.18</total>";
1 голос
/ 19 июня 2019

С bash и регулярным выражением:

tail -n 5 file | while read -r line; do [[ $line =~ (.*):\ (.*) ]]; echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}"; done

Вывод:

Added 3
Modified 0
Deleted 2
Excluded 1
Total Time 6.18

Обновление:

tail -n 5 file | while read -r line; do [[ $line =~ ([^\ ]*).*:\ (.*) ]]; echo "echo \"<${BASH_REMATCH[1],,}>${BASH_REMATCH[2]}</${BASH_REMATCH[1],,}>\""; done

Вывод:

echo "<added>3</added>"
echo "<modified>0</modified>"
echo "<deleted>2</deleted>"
echo "<excluded>1</excluded>"
echo "<total>6.18</total>"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...