Извлечение числовых данных из сложного шаблона в текстовый файл и вывод в виде таблицы

Вы можете рассмотреть возможность использования debugfs (8) , но если вы заботитесь о своих данных, вы Лучше использовать это на каком-нибудь образе диска, а не на самом разделе.

2
02.05.2018, 18:35
3 ответа

Быстрая команда awkпоможет вам начать работу:

awk '$2 ~ /Success/{a=$4;next}; $2 ~ /Completed/{b=$8;c=$13;print a,b,c}' terminal_output.txt

Это не будет работать, если у вас есть несколько строк Successперед строкой Completedи т. д.

-1
27.01.2020, 22:18

Совместимость с POSIX -sed:

grep -e 'Success' -e 'Completed' your_file | sed 'N;s/Success with \([[:digit:]]\+\).*T_init = \([^[:space:]]\+\).*T_sink = \([^[:space:]]\+\).*/\2 \3 \1/;s/\.00//g'

GNU sed:(, в котором .не соответствует \nпо крайней мере в 4.2.2 на CentOS)

grep -e 'Success' -e 'Completed' your_file | sed 'N;s/Success with \([[:digit:]]\+\).*\n.*T_init = \([^[:space:]]\+\).*T_sink = \([^[:space:]]\+\).*/\2 \3 \1/;s/\.00//g'

Захватывает строки, содержащие Successи Completed, затем работает с двумя строками (более явно, чем необходимо )извлекает три интересующих вас поля и упорядочивает их в одну строку.

Это только усекает .00любые числа, оставляя в покое любой значащий дробный компонент (, включая что-то вроде 12.20, по-прежнему будет один конечный нуль ).

Предостережение, если некоторые из этих ...строк содержат CompletedилиSuccess

0
27.01.2020, 22:18

По сути, это вопрос захвата тех частей, которые вам нужны, и отбрасывания тех, которые вам не нужны. Например, используя sed, вы можете захватить целочисленное значение Successи скопировать его в область хранения(h ), извлекая и добавляя его(G)к захваченным цифрам Completed. ] строка:

sed -nE \
  -e '/Success/ {s/.* ([0-9]+).*/\1/; h;}' \
  -e '/Completed/{G; s/.*T_init = ([0-9]+)\.00 degC & T_sink = ([0-9]+).*\n/\1 \2 /; p;}
' terminal_output.txt

Perl предоставляет несколько более выразительный синтаксис, который, ИМХО, более удобочитаем.:

perl -lne '
  our $a = $1 if /Success.*?(\d+)/; print join " ", /(\d+)\.\d+/g, $a if /Completed/
' terminal_output.txt

дает желаемый результат

25 35 128
30 40 307
2
27.01.2020, 22:18

Теги

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