Использование команды awk в сценарии perl [закрыто]

Может ли кто-нибудь подсказать, как использовать конвейерную передачу команд в сценарии Perl? В частности, команды, которые включают вызов awk ?

Я пытаюсь создать сценарий Perl, который будет считывать использование диска с помощью df -H и возвращать вторую последнюю строку вывода, которая показывает% использования. Ввод команды непосредственно в терминале возвращает желаемый результат.

df -H | awk '{print $(NF-3)}'

Эта команда возвращает правильные результаты. Но при использовании той же команды в утилите обратного тика сценарий perl выдает много ошибок.

$thirdlast=`df -H | awk '{print $(NF-3)}'`;
print $thirdlast;

Почему эта же команда не выполняется в сценарии? Есть ли другой способ вернуть требуемые результаты?

2
задан 13 May 2015 в 17:55

1 ответ

Основная проблема состоит в том что $ важно для жемчуга. При использовании его в системной команде необходимо выйти из него:

$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.

6
ответ дан 13 May 2015 в 17:55

Другие вопросы по тегам:

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