awk '{ s = sprintf("%06d", $2); d = substr(s,1,2); m = substr(s,3,2); y = "20" substr(s,5,2); printf("%s%s%s.%s.%s%s%s%s", $1, OFS, m, d, y, OFS, $3, ORS) }' file.in
89 07.15.2016 -50,00
101 08.17.2016 -50,00
123 10.14.2016 -100,00
142 12.09.2016 -100,00
19 02.14.2017 -100,00
38 03.23.2017 -50,00
50 04.20.2017 -50,00
65 05.26.2017 -50,00
77 06.19.2017 -50,00
95 07.20.2017 -50,00
106 08.15.2017 -50,00
120 09.15.2017 -50,00
164 11.17.2017 -100,00
10 01.15.2018 -100,00
Код awk
в более красивой форме:
{
s = sprintf("%06d", $2)
d = substr(s,1,2)
m = substr(s,3,2)
y = "20" substr(s,5,2)
printf("%s%s%s.%s.%s%s%s%s", $1, OFS, m, d, y, OFS, $3, ORS)
}
s
сначала устанавливается равным нулю -заполненной шестизначной форме второго поля ввода. d
, m
иy
(день, месяц и год )затем извлекаются из этой строки, и 20
добавляется в качестве префикса к части года.
Затем printf
распечатывает результирующую запись. OFS
— текущий разделитель выходных полей(обычно пробел ), а ORS
— разделитель выходных записей(обычно новая строка ).
Для получения вкладки -отдельного вывода:
awk -vOFS='\t' '{...as above... }' file.in
Вы можете легко интегрировать все это в один awk
вызов:
lvs | awk '$1=="lv_root" {split($4,a,"."); print a[1]}'
Это проверит конец первого поля и обработает только строку, где это равно lv_root
. Затем он разделит 4-е поле в .
на массив a
и напечатает первую запись, соответствующую части перед .
.
То же самое может быть достигнуто путем печати размера в виде целого числа с использованием printf
, которое также усекает числа с плавающей запятой -до ближайшего меньшего целого числа (и, что интересно, игнорирует «текстовые части» за числовой частью, в данном случаеg
):
lvs | awk '$1=="lv_root" {printf "%d\n",$4}'
Обратите внимание , что это не равно округлению размера до ближайшего целого числа. Если вы хотите добиться этого, вы можете использовать
lvs | awk '$1=="lv_root" {printf "%.0f\n",$4}'
lvs
показывает информацию о томах LVM. Он может дать вам размер блочного устройства, содержащего корневую файловую систему (, а не размер этой файловой системы ), если эта файловая система окажется на томе LVM, и если вы знаете, какой из них (и нет, имя логического тома не не имеет "корень" в нем ).
size=$(
lvs --unit b --nosuffix --no-headings --config 'log{prefix=""}' -o size vgW/lv_root
)
Чтобы узнать размер блочного устройства, содержащего корневую файловую систему, будь то том LVM или раздел диска, или устройство NBD/loop/md... (, но учтите, что корневая файловая система не имеет для поддержки блочного устройства, например для сетевых файловых систем, zfs, btrfs... ), в Linux,Я бы использовал lsblk
вместо:
size=$(
lsblk -Jbo size,mountpoint | jq '.blockdevices[]|select(.mountpoint=="/").size'
)
Чтобы узнать размер файловой системы /
, вы можете использовать df
(, предполагая, что GNUdf
)илиfindmnt
:
size=$(findmnt -bno size /)
size=$(df -B1 --output=size / | awk 'NR==2{print $1}')
Они дают вам размер в байтах, то есть с наибольшей точностью. Если вы хотите округлить размер до целого числа гигабайт, просто разделите его на 1000000000:
gigabytes=$((size / 1000000000))
Или, чтобы получить его в гибибайтах (, обратите внимание, что lvs
использует суффиксы на основе 1024, где g
означает гибибайты, а не гигабайты ), используйте:
gibibytes=$((size / 1024 / 1024 / 1024))
Хотя все приведенные выше команды также позволяют указать другую единицу измерения (, но остерегайтесь гигабайта против гигибайта, и большинство из них даст вам числа с плавающей запятой и может по-разному округлять и использовать разные символы для десятичной системы счисления в зависимости от локали ).
awk '$1 ~/root$/{gsub(/\..*/,"",$NF);print $NF}' filename
выход
praveen:/tmp$ awk '$1 ~/root$/{gsub(/\..*/,"",$NF);print $NF}' filename
100
praveen@praveen:/tmp$