LinuxForum.Fans
Тема

Не слишком ли громоздко?

Автор: Kettler 34 сообщений 6511 просмотров
#169178

xxx@xxx:~$ cat /var/log/dhcpd.leases

text
lease 172.16.0.10 {
  starts 5 2011/06/10 20:55:50;
  ends 6 2011/06/11 02:55:50;
  cltt 5 2011/06/10 20:55:50;
  binding state active;
  next binding state free;
  hardware ethernet 00:xx:xx:a1:e5:b3;
  uid "\001\000\035\222\241\345\263";
  set ddns-rev-name = "10.0.16.172.in-addr.arpa.";
  set ddns-txt = "31327fdf3d5f7fcc5893825a585a73caf9";
  set ddns-fwd-name = "user-pk.example.com.";
  client-hostname "user-pk";
}

xxx@xxxr:~$ awk '$2 =="ethernet" || $2 =="ddns-fwd-name" {print}' /var/log/dhcpd.leases | sed 's/;//g;s/."//g;s/=//g' | awk '{print $3}'

text
xx:xx:92:a1:e5:b3
user-pk.example.com
#169183
Kettler написал:
xxx@xxxr:~$ awk '$2 =="ethernet" || $2 =="ddns-fwd-name" {print}' /var/log/dhcpd.leases | sed 's/;//g;s/."//g;s/=//g' | awk '{print $3}'

зачем мешать вместе sed и awk?

#169209
drBatty написал:
[quote=Kettler]xxx@xxxr:~$ awk '$2 =="ethernet" || $2 =="ddns-fwd-name" {print}' /var/log/dhcpd.leases | sed 's/;//g;s/."//g;s/=//g' | awk '{print $3}'

зачем мешать вместе sed и awk?[/quote]
SED отлично подгоняет а AWK чётко шаблонизирует.

#169235
Kettler написал:
SED отлично подгоняет а AWK чётко шаблонизирует.

смешение языков отрицательно влияет как на производительность, так и на удобство обслуживания. Смешивать можно только очень разные ЯП, которые имеют весомые преимущества. Например bash+C. А мешать близкие по назначению ЯП - не имеет смысла.
в вашем случае более надёжно и более просто писать на чистой sed, awk в данном случае хуже.

#169246

Подскажи как сделать, чтобы выхлоп был не

text
xx:xx:92:a1:e5:b3
user-pk.example.com

а вот так

text
xx:xx:92:a1:e5:b3 user-pk.example.com
#169300

Забудьте, всё равно решил углубиться в perl.

#169302
Kettler написал:
Забудьте всё равно решил углубиться в perl.

перловка не нужна.
и кстати - зря. на перле и так программы кривые, а уж с вашим-то стилем...

#169303
drBatty написал:
[quote=Kettler]Забудьте всё равно решил углубиться в perl.

перловка не нужна.
и кстати - зря. на перле и так программы кривые, а уж с вашим-то стилем...[/quote]
угу, я ток учусь. Но perl надо изучить для мелких своих задач, чтоб не просить никого.
Для меня это всё так > тренировка. Я не собираюсь программировать на public, а так чисто для себя.
Для своих мелких задач думаю справиться.

#169309
Kettler написал:
Но perl надо изучить для мелких своих задач чтоб не просить не кого.

bash'а мало?

Kettler написал:
Для меня это всё так > тренировка. Я не собираюсь программировать на public а так чисто для себя.
Для своих мелких задач думаю справиться.

ну дело ваше...

#169314
drBatty написал:
[quote=Kettler]Но perl надо изучить для мелких своих задач чтоб не просить не кого.

bash'а мало?

Kettler написал:
Для меня это всё так > тренировка. Я не собираюсь программировать на public а так чисто для себя.
Для своих мелких задач думаю справиться.

ну дело ваше...[/quote]
забыл про bash спс.

#169330
Kettler написал:
забыл про bash спс.

дык в 95% достаточно баша. А в 5% остатка можно написать что-то вроде

text
X=`sed ...`

ну или там awk, хотя awk нафиг не нужно, ибо баш и считать умеет, и на поля разбивает.

#169516

Зделал на perl.

text

#!/usr/bin/perl
open(InFile, "/var/log/dhcpd.leases") || die;
while ($line = <InFile>)
{

$lease = index ($line, "lease"); $hardware = index ($line, "hardware ethernet"); $ddns = index ($line, "ddns-fwd-name");

if ($lease == "-1"){ } else { ($namee, $ip) = split (" ", $line); }

if ($hardware == "-1"){ } else { ($nameee, $ipp, $mak) = split (" ", $line); chop ($mak); }

if ($ddns == "-1"){ } else { ($nam, $ippp, $makk, $name) = split (" ", $line); chop ($name); $lenname = length ($name); $n = substr ($name, "1" , $len-2); }

if ($ip gt "") { if ($mak gt "") { if ($lenname > "0") { print ($ip, " ", $mak, " ", $n, "\n"); $lenname = ""; $ip = ""; $mak = ""; $n = ""; } } } } close ( InFile );

вывод

172.16.0.10 xxx:xxx:xxx:a1:e5:b3 user-pk.example.com
172.16.0.56 xxx:xxx:xxx:27:a1:01 DIR-320.example.com

Или так

text

#!/usr/bin/perl
open(InFile, "/var/log/dhcpd.leases") || die;
while ($line = <InFile>)
{
($n1, $n2, $n3, $n4) = split (" ", $line);
        if ($n1 eq "lease")
        {
        $ip=$n2;
        }
        if ($n1 eq "starts")
        {
        $sdate=$n3;
        }
        if ($n1 eq "ends")
        {
        $edate=$n3;
        }
        if ($n1 eq "hardware")
        {
        $mak=$n3;
        }
        if ($n2 eq "ddns-fwd-name")
        {
        $name=$n4;
        }

if ($ip gt "" & $sdate gt "" & $edate gt "" & $mak gt "" & $name gt "") { chop ($mak); chop ($name); $lenname = length ($name); $n = substr ($name, "1" , $len-2); print $ip , " ", $sdate, " ", $edate, " ", $mak, " ", $n, " ", "\n"; $sdate=""; $edate=""; $mak=""; $name=""; $n=""; $lenname=""; } } close ( InFile );

172.16.0.10 2011/06/10 2011/06/11 xxx:xxx:xxx:a1:e5:b3 user-pk.example.com
172.16.0.56 2011/06/10 2011/06/11 xxx:xxx:xxx:27:a1:01 DIR-320.example.com
172.16.0.56 2011/06/11 2011/06/11 xxx:xxx:xxx:27:a1:01 DIR-320.example.com

#169570

без седа я додумалсо только до такого
[console] awk ' {if ($2 ~ /ethernet/) { gsub(";",""); print $3} if($2 ~ /ddns-fwd-name/) {{sub(/\.\"\;/,"")}; sub(/"/,""); print $4}}' /home/mogul82/test/ww[/console]

не смог одним regEx описать что бы убрать
из строки
"user-pk.example.com.";
убрать лишние символы

#169572

во
там только регулярное выражение в gsub надо подредактировать, что бы точки в конце не было после user-pk.example.com.
[console]awk '/ethernet/ || /ddns-fwd-name/ {{ gsub("[\;\"\=]",""); print $3}}' /home/mogul82/test/ww
[/console]

#169598

$name =~ s/"//g;
chop $name;

#169599

[console]$ sed -rn '/^\s*hardware ethernet\s+/{s///;h};/^\s*set ddns-fwd-name = "/{s///;H;g;s/(.*);\n(.*)\.";/\1 \2/p}' kt.txt
00:xx:xx:a1:e5:b3 user-pk.example.com
[/console]

#169605

у меня короче вариант хы

#169615
mogul82 написал:
у меня короче вариант хы

мой более надёжный.

Войдите или зарегистрируйтесь, чтобы ответить.