LINUX.ORG.RU

perl for dummy


0

0

Выводит как надо .
iptables -L band -n -v -x | grep $IP | awk '{print $2}'

в перл скрипте такое не прокатывает
print `iptables -L band-in -n -v -x | grep $ | awk '{print $2}'`;

выводит только iptables -L band-in -n -v -x | grep $IP
Где я туплю . Чуствую что с синтаксисом не все впорядке

★★

`` -- интерполируемая кавычка.
Ты ж оптимист, определись -- у тебя есть иллюзия, что $IP из перла должно браться, а $2 в awk из шелла, что ли?

Zulu ★★☆☆
()
Ответ на: комментарий от Zulu

$2 указывает на второе поле строки а не на переменную

print `echo"1 2 3" | awk '{print $2}'`;

выведет 1 2 3 , а должно только второе поле в строке.
если вызывается шел команда то и должна отработать до конца со всеми своими переменными.
вот и написал бы как правильно обработать вложеные кавычки?

sova ★★
() автор топика
Ответ на: комментарий от sova

Зачем так делать в перл?

open(IPTAB, "/sbin/iptables -L band-in -n -v -x |") || die "Error...";
while (<IPTAB>) {
  if (/$IP/) {
     do something  
  }
}

sdio ★★★★★
()
Ответ на: комментарий от sova

блин, аж самому стало интересно.

держи:

root@surgut:~# cat script.pl
#!/usr/bin/perl -w
use strict;
my ($arg,$data,$a, $b, $c);
foreach $arg (@ARGV) {
$data = qx(iptables -L -v -n | grep $arg);
($a, $b, $c) = split /\s+/, $data, 3;
print "$arg = $b\n";
}

root@surgut:~# ./script.pl 192.168.0.12 192.168.0.14
192.168.0.12 = 11M
192.168.0.14 = 4187K
root@surgut:~#

=))))))

gr_buza ★★★★
()
Ответ на: комментарий от gr_buza

#!/usr/bin/perl -w
use strict;
my ($arg,$data,$a, $b, $c);
if (not defined @ARGV) {
print "Usage: $0 ip-address [ip-address...]\n";
exit 0;
}
foreach $arg (@ARGV) {
$data = qx(iptables -L -v -n | grep $arg);
if ($data) {
($a, $b, $c) = split /\s+/, $data, 3;
print "$arg = $b\n";
}
else {
print "Invalid search pattern. Check spelling.\n";
exit 1;
}
}

слегка модифицированный вариант, с обработкой ошибок.

gr_buza ★★★★
()
Ответ на: комментарий от gr_buza

Это конечно все правильно только смысл в другом
как правильно через перл вызвать конструкцию такого вида , когда вложен awk с его синтаксисом:
print `echo"1 2 3" | awk '{print $2}'`;

потому как это же можно решить и примерно так :

print `echo"1 2 3" | cut -d " " -f2`;

и так как выше все написали =)

sova ★★
() автор топика
Ответ на: комментарий от sova

Ок, отвечаю.

man perlop.
и уяснить разницу между

qx'echo "1 2 3"|awk \'{print $2}\''
и
qx"echo \"1 2 3\"|awk '{print $2}'"

Повторю еще раз -- `` это интерполируемая кавычка.

Zulu ★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.