linux + вывести размер корневой файловой системы

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
-1
17.12.2020, 13:26
3 ответа

Вы можете легко интегрировать все это в один 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}'
3
18.03.2021, 22:42

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))

Хотя все приведенные выше команды также позволяют указать другую единицу измерения (, но остерегайтесь гигабайта против гигибайта, и большинство из них даст вам числа с плавающей запятой и может по-разному округлять и использовать разные символы для десятичной системы счисления в зависимости от локали ).

5
18.03.2021, 22:42
awk '$1 ~/root$/{gsub(/\..*/,"",$NF);print $NF}' filename

выход

praveen:/tmp$ awk '$1 ~/root$/{gsub(/\..*/,"",$NF);print $NF}' filename
100
praveen@praveen:/tmp$ 
0
18.03.2021, 22:42

Теги

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