Как понять команду awk '{для (x=1; $x; ++ x) печатают $x}'?

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

Короче говоря, это в случае крайней необходимости. Следует иметь в виду, что заполнение диска общего назначения к 100% (или 95%) является большой ошибкой; реалистично, жесткий диск на 100 ГБ не должен использоваться для хранения больше чем 90-95 ГБ (и возможно идеально, еще меньше, чем это). Таким образом, те "зарезервированные блоки" не являются реальной проблемой.

Если Вы уже понимаете все это и просто хотите способ получить % использования, эксклюзивный из зарезервированных блоков, ответ, вероятно: арифметика ;)

5
23.05.2017, 15:40
3 ответа

Нет. 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
13
27.01.2020, 20:31

Так как тердон дал исчерпывающий ответ, я просто хочу добавить, что если какой-либо столбец оценен как ложный, то оператор for завершает цикл, как видно из этого примера:

$ echo 1 2 3 4 5 0 6|awk '{for(x=1;$x;++x)print $x}' 
1
2
3
4
5
6
27.01.2020, 20:31
  1. ++x и x++ функционально эквивалентны при использовании в автономном режиме.  Как обсуждалось в вопросе о переполнении стека, на который вы ссылались,

    • могут быть различия в производительности (т.е. в сроках).
    • Результат что-то = ++x; . и что-то = x++; отличаются - но твой пример этого не делает.

    Итак, что касается инкремента x , ваш пример эквивалентен

    awk '{for(x=1;$x;x++) печатает $x}'.
    
  2. Автономный $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 является нулевым значением.

3
27.01.2020, 20:31

Теги

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