Вы можете рассмотреть возможность использования debugfs (8) , но если вы заботитесь о своих данных, вы Лучше использовать это на каком-нибудь образе диска, а не на самом разделе.
Быстрая команда awk
поможет вам начать работу:
awk '$2 ~ /Success/{a=$4;next}; $2 ~ /Completed/{b=$8;c=$13;print a,b,c}' terminal_output.txt
Это не будет работать, если у вас есть несколько строк Success
перед строкой Completed
и т. д.
Совместимость с 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
По сути, это вопрос захвата тех частей, которые вам нужны, и отбрасывания тех, которые вам не нужны. Например, используя 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