Как преобразовать смешанные значения длительности минут -и -секунд в журнале (в формате logfmt )в согласованные единицы?

Предполагая, что в строках входного файла нет пробелов в конце строк:

$ awk -F ':' 'BEGIN { OFS=FS } $1 in ports { ports[$1] = ports[$1] "," $2; next } { ports[$1] = $2 } END { for (ip in ports) print ip, ports[ip] }' file
3.3.3.3:80,443
1.1.1.1:21,22
2.2.2.2:443

Сценарий awk,

BEGIN       { OFS=FS }
$1 in ports { ports[$1] = ports[$1] "," $2; next }
            { ports[$1] = $2 }
END         { for (ip in ports) print ip, ports[ip] }

сначала установит разделитель полей вывода таким же, как разделитель полей ввода, который является символом :(это задается в командной строке с помощью -F ':'), затем он будет проверять, поле (IP-адрес )является ключом в массиве ports. Если это так, номер порта (второго поля )добавляется с запятой в качестве разделителя к этой записи массива. Если это не так, запись в массиве просто устанавливается на номер порта для этого IP-адреса.

В конце все сохраненные IP-адреса выводятся вместе с собранными номерами портов.

0
27.01.2021, 00:10
2 ответа

Использованиеawk:

awk -F'[= ]' '{ 
  n=split($2, a, "m")
  sub($2, sprintf("%.9f", (n==1 ? a[1] : 60*a[1]+a[2])))
}1' file

Выход:

duration=38.924266437 job=267842 project=507
duration=38.924266437 job=267842 project=507
duration=176.408984141 job=267850 project=745
duration=176.408984141 job=267850 project=745
duration=218.211342699 job=267846 project=173
duration=218.211342699 job=267846 project=173
duration=218.690043053 job=267843 project=173
duration=218.690043053 job=267843 project=173
  • Используйте =и в качестве разделителей полей, второе поле $2содержит целевую строку, например. 38.924266437s.
  • Разбить второе поле строки mна массив a, n— длина массива.
  • Вычислить новое значение. :Если nравно 1, то используйте первое значение массива (в секундах ), иначе вычислите секунды из обоих значений массива.
  • Замените второе поле вычисляемым значением в формате с плавающей запятой.
  • Распечатать запись.
1
18.03.2021, 22:34

Как насчет этого?

#!/bin/bash

regex_min='duration=([0-9]+)m'
regex_sec='([0-9]+)\.([0-9]+)s'

while read -r line; do
	[[ $line =~ $regex_sec ]]
	sec=${BASH_REMATCH[1]}
	frac=${BASH_REMATCH[2]}
	if [[ $line =~ $regex_min ]]; then
		sec=$(( sec + 60*${BASH_REMATCH[1]} ))
	fi

	echo $line: $sec.$frac
done

Попробуйте онлайн!

Сохраните его как process.shи запустите :cat myfile | bash process.sh

Вот результат, который вы получите с вашими примерами данных:

duration=38.924266437s job=267842 project=507: 38.924266437
duration=38.924266437s job=267842 project=507: 38.924266437
duration=2m56.408984141s job=267850 project=745: 176.408984141
duration=2m56.408984141s job=267850 project=745: 176.408984141
duration=3m38.211342699s job=267846 project=173: 218.211342699
duration=3m38.211342699s job=267846 project=173: 218.211342699
duration=3m38.690043053s job=267843 project=173: 218.690043053
0
18.03.2021, 22:34

Теги

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