2013-03-13 3 views
0

Я должен проверить наличие свободного места на томе диска, и я с помощью команды df -h, которая производит этот выходКак я заменить G с белым пространством

Filesystem   Size Used Avail Use% Mounted on 
/dev/md0    27G 24G 2.1G 92%/
udev     506M 112K 506M 1% /dev 
/dev/sda1    102M 40M 63M 39% /boot 

Этот фрагмент сценария

my (@space, @freesp); 
@space = grep /\/dev\/md0/,`df -h`; 
print "@space\n"; 

дает мне

/dev/md0    27G 24G 2.1G 92%/

Что я могу разделить на пробельных давая значения в $freesp[0], $freesp[1] и т.д.

Но я хочу, чтобы удалить или заменить эту G с белым пространством, так что я могу сравнить $freesp[3] с некоторым значением и могу продолжить мой сценарий.

Итак, какое регулярное выражение я должен использовать для этого, или есть ли другой лучший способ сделать это?

Этот код работает на меня, но я смотрю в направлении, о котором я упомянул.

#!/usr/bin/perl 

use strict; 
use warnings; 

my (@space, @freesp); 

@space = grep /\/dev\/md0/, `df`; 

print "@space\n"; 

for (@space) { 
    chomp; 
    @freesp = split /\s+/, $_; 
} 

if ($freesp[3]/1024/1024 < 2.0) { 
    print "Space is less\n"; 
} 
else { 
    print "Space is OK\n"; 
} 

#print ($freesp[3]/1024/1024); 
+0

[Не разбирайте вывод 'df'. Это не очень хорошая идея.] (Http://stackoverflow.com/a/6351257) – daxim

ответ

8

Реальное решение not to use the -h option to df, если вы собираетесь разобрать вывод с помощью сценария. Таким образом, на выходе не будут содержаться суффиксы «правдоподобный» K/M/G.

Возможно, вы захотите вместо этого использовать опцию -B1, которая заставляет все размеры сообщаться в байтах.


Edit: Чтобы ответить на буквальный вопрос, вы могли удалить суффиксы и переранжировать значения соответствующим образом:

my %units = (K => 2**10, M => 2**20, G => 2**30, T => 2**40, 
      P => 2**50, E => 2**60, Z => 2**70, Y => 2**80); 

s/^(\d+(?:\.\d+)?)([KMGTPEZY])$/$1 * $units{$2}/e for @freesp[1 .. 3]; 

Однако, используя -B1 переключатель вместо -h даст тот же результат легче, не говоря уже более точно и надежно.

+0

Я знаю, что используя df и делясь на 1024, чтобы получить наш O/p, но мне интересно, есть ли какой-то способ относительно того, что я упомянул ......... то есть, если цифра, за которой следует G, затем замените G/M/K на пробел – mviswa

+0

** #!/usr/bin/perl use strict; использовать предупреждения; my (@ space, @ freesp); @ space = grep/\/dev \/md0 /, 'df'; print "@space \ n"; для (@space) { chomp; @ freesp = split/\ s + /, $ _; } if ($ freesp [3]/1024/1024 <2.0) { print "Пробел меньше \ n"; } else { печать «Пространство в порядке \ n»; } #print ($ freesp [3]/1024/1024); ** этот код работает для меня, но я смотрю в направлении, о котором я упомянул ........ – mviswa

+2

@mViswa Что вы можете надеяться получить, используя человеческий читаемый формат и удалив 'G/M/K' а затем сравнить? Не используйте параметр '-h', если вы собираетесь анализировать вывод с помощью скрипта. – TLP

Смежные вопросы