Может ли кто-нибудь подсказать, как использовать конвейерную передачу команд в сценарии Perl?
В частности, команды, которые включают вызов awk
?
Я пытаюсь создать сценарий Perl, который будет считывать использование диска с помощью df -H
и возвращать вторую последнюю строку вывода, которая показывает% использования.
Ввод команды непосредственно в терминале возвращает желаемый результат.
df -H | awk '{print $(NF-3)}'
Эта команда возвращает правильные результаты. Но при использовании той же команды в утилите обратного тика сценарий perl выдает много ошибок.
$thirdlast=`df -H | awk '{print $(NF-3)}'`;
print $thirdlast;
Почему эта же команда не выполняется в сценарии? Есть ли другой способ вернуть требуемые результаты?
Основная проблема состоит в том что $
важно для жемчуга. При использовании его в системной команде необходимо выйти из него:
$thirdlast=`df -H | awk '{print \$(NF-3)}'`;
print $thirdlast;
Иначе жемчуг попытается расшириться $(NF-3)
как переменная жемчуга. Переменная $(
реальный GID процесса жемчуга:
$(
Реальный ценуроз этого процесса. Если Вы находитесь на машине, которая поддерживает членство в нескольких группах одновременно, дает разделенный список пространства групп, Вы находитесь в.
Переменная $)
эффективный GID процесса:
Так, $(NF-3)
оценивает к list of groups you are a member of NF-3)
. Например, в моей системе, которая является:
$ perl -le 'print "$(NF-3)"'
1001 27 29 111 112 1001NF-3)
Следующая проблема состоит в том что Ваш awk
вызов является неправильным. %
использование $(NF-1)
, нет $(NF-3)
. Так, что Вы хотели:
$thirdlast=`df -H | awk '{print \$(NF-1)}'`;
Или, чтобы только распечатать проценты выше определенного порога, например, 90:
$thirdlast=`df -H | awk '(\$(NF-1)>90){print \$(NF-1)}'`;
В любом случае Вы могли просто обработать вывод df
в самом Perl:
$thirdlast=`df -H`;
@matches=($thirdlast=~/(\S+%)/g);
print "@matches\n";
Или
@matches=(`df -H`=~/(\S+%)/g);
print "@matches\n";
И устанавливать порог:
@matches=(`df -H`=~/(\S+%)/g);
@above90=grep {$_>90} @matches;
print "@above90\n";
Или, более непосредственно:
@matches=grep {$_ >90} (`df -H`=~/(\S+%)/g);
print "@matches\n";
@array=($variable=~/foo/g)
сохранит все соответствия регулярного выражения foo
в переменной $variable
в массив @matches
. Это будет иметь тот же результат как парсинг df
с awk
.