Я думаю, что идея зарезервированных блоков состоит в том, что, после того как файловая система заполнена до способности без зарезервированных блоков, только корневые процессы смогут записать в диск. Так функции пространства как буферная зона, после того как диск в других отношениях полон - это не существующая ранее область. Следовательно, нет никакой отдельной статистической величины использования для того пространства, потому что это (обычно) теоретически.
Короче говоря, это в случае крайней необходимости. Следует иметь в виду, что заполнение диска общего назначения к 100% (или 95%) является большой ошибкой; реалистично, жесткий диск на 100 ГБ не должен использоваться для хранения больше чем 90-95 ГБ (и возможно идеально, еще меньше, чем это). Таким образом, те "зарезервированные блоки" не являются реальной проблемой.
Если Вы уже понимаете все это и просто хотите способ получить % использования, эксклюзивный из зарезервированных блоков, ответ, вероятно: арифметика ;)
Нет. for (i = 0; i <10; i ++)
- это классическая программная конструкция (см. Традиционные циклы for ), которая присутствует во многих языках. Его можно разбить на:
start-expression; end-condition; end-of-iteration-expression
Другими словами, то, что я написал выше, означает «инициализировать i равным 0 и, пока i меньше 10, сделать что-нибудь и затем увеличить i на 1. Да, синтаксис сбивает с толку, но так оно и есть. Выражение конца итерации
(в данном случае ++ x
) выполняется один раз в конце каждого цикла. эквивалентно записи:
while(i<10){print i; ++i}
Что касается $ x
, я считаю, что он просто проверяет, существует ли поле с этим числом и что его содержимое не оценивается как ложное (как объяснено в ответе Матиаса ниже ). $ N
вернет истину, если поле номер N существует и не является типом false
. Например:
$ echo "a b c d" | awk '($4){print "yes"}'
yes
$ echo "a b c d" | awk '($14){print "yes"}' ## prints nothing, no $14
$ echo "a b c 0" | awk '($4){print "yes"}' ## prints nothing, $4 is 0
Как видно выше, первая команда выводит yes
, потому что есть $ 4
. Поскольку нет $ 14
, вторая ничего не печатает. Итак, чтобы вернуться к исходному примеру:
awk '{for(x=1;$x;x++)print $x}'
___ __ ___
| | |
| | |-----> increment x by 1 at the end of each loop.
| |--------> run the loop as long as there is a field number x
|------------> initialize x to 1
Так как тердон дал исчерпывающий ответ, я просто хочу добавить, что если какой-либо столбец оценен как ложный, то оператор for завершает цикл, как видно из этого примера:
$ echo 1 2 3 4 5 0 6|awk '{for(x=1;$x;++x)print $x}'
1
2
3
4
5
++x
и x++
функционально эквивалентны при использовании в автономном режиме.
Как обсуждалось в вопросе о переполнении стека, на который вы ссылались,
что-то = ++x;
.
и что-то = x++;
отличаются -
но твой пример этого не делает. Итак, что касается инкремента x
,
ваш пример эквивалентен
awk '{for(x=1;$x;x++) печатает $x}'.
Автономный $x
эквивалентен $x != ""
,
так что петля будет итерировать, пока не столкнется с пустым полем.
Это ленивый ярлык для x <= NF
,
где NF
- это количество полей в текущей записи (строке).
Для целей вашего примера это безвредно, AFAICT.
Но, если указать разделитель полей по умолчанию,
awk -F, '{for(x=1;$x;++x) выведите $x}'.
это попытается сделать то же самое, что и в вашем примере, но разделение строк запятыми.
Если вы наберете a b
, то получится a b
.
Если вы наберете a,b
, то он выведет a
и b
на отдельные строки.
Но если вы введете a,,b
, она выведет a
и затем остановится, потому что $2
является нулевым значением.