Как отмечено в GNU Awk Users' Guide 8.2 Использование чисел для индексации массивов
An important aspect to remember about arrays is that array subscripts are always strings. When a numeric value is used as a subscript, it is converted to a string value before being used for subscripting
Если n
равно 7432
, то n/1000
равно 7.432
-, оно не будет округляться по умолчанию. Так
$ awk -vn=7432 'BEGIN{arr[7] = "seven"; arr["7.432"] = "foo"; p = n/1000; print p, arr[p]}'
7.432 foo
тогда как
$ awk -vn=7432 'BEGIN{arr[7] = "seven"; arr["7.432"] = "foo"; p = int(n/1000); print p, arr[p]}'
7 seven
Этот пример изman stdbuf
— то, что вам нужно. Это применимо для общего случая, когда вы хотите направить поток на uniq
, подобно этому. И причина в том, что uniq
нужно увидеть больше строк, чтобы решить, следует ли печатать текущую строку или нет.
EXAMPLES
tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq
This will immediately display unique entries from access.log
Для вашего случая:
free -s1 -h | stdbuf -oL awk 'NR%4==2' | uniq
Другой способ сделать это — использовать одну команду awk
, сохраняя только что напечатанную строку и проверяя это значение перед печатью:
free -s1 -h | awk 'NR%4 == 2 {if ($0 != p) print; p = $0}'
Кроме того, для отслеживания вывода команды может быть полезно watch
.