sed (вывод нужных полей)

Модератор: Модераторы разделов

Аватара пользователя
Alexxx
Сообщения: 892
Статус: --==XXX==--
ОС: Archlinux current

sed

Сообщение Alexxx »

Ребята, подскажите как попроще сделать, а то уж больно громоздко получается:

Код: Выделить всё

/sbin/ifstat -a ppp0 | grep ppp0 | sed "/[^ ]* [ ]*\([^ ]*\) [ ]*\([^ ]*\) [ ]*\([^ ]*\) [ ]*\([^ ]*\) [ ]*\([^ ]*\) [ ]*\([^ ]*\) [ ]*\([^ ]*\).*/s//\5:\7/"
Спасибо сказали:
Nab
Сообщения: 257

Re: sed

Сообщение Nab »

/sbin/ifstat ppp0 -a | grep ppp0 | sed -n "s/[^ ]* *[^ ]* *[^ ]* *[^ ]* *\([^ ]*\) *[^ ]* *\([^ ]*\).*/\1:\2/p"

По моему это будет тоже самое...
Ну и конечно можно еще поплясать, но это минимум который нужно убрать :)
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
Alexxx
Сообщения: 892
Статус: --==XXX==--
ОС: Archlinux current

Re: sed

Сообщение Alexxx »

Nab писал(а):
10.05.2006 18:23
/sbin/ifstat ppp0 -a | grep ppp0 | sed -n "s/[^ ]* *[^ ]* *[^ ]* *[^ ]* *\([^ ]*\) *[^ ]* *\([^ ]*\).*/\1:\2/p"

По моему это будет тоже самое...
Ну и конечно можно еще поплясать, но это минимум который нужно убрать :)

Ага, понял, спасибо. Работает как надо.
Спасибо сказали:
Nab
Сообщения: 257

Re: sed

Сообщение Nab »

Блин тока щас заметил что grep перед этим стоит....
Давай так, покажи мне плиз вывод
/sbin/ifstat ppp0 -a

Я думаю все намного проще можно организовать...
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
Alexxx
Сообщения: 892
Статус: --==XXX==--
ОС: Archlinux current

Re: sed

Сообщение Alexxx »

Код: Выделить всё

alex:$ /sbin/ifstat ppp0 -a
#kernel
Interface        RX Pkts/Rate    TX Pkts/Rate    RX Data/Rate    TX Data/Rate
                 RX Errs/Drop    TX Errs/Drop    RX Over/Rate    TX Coll/Rate
ppp0                 841 0           893 0        560828 0        199966 0
                       0 0             0 0             0 0             0 0
Вывести надо 560828:199966
Спасибо сказали:
Nab
Сообщения: 257

Re: sed

Сообщение Nab »

Вот один из вариантов
/sbin/ifstat ppp0 -a | sed -n "s/ppp[0-9] *[^ ]* *[^ ]* *[^ ]* *[^ ]* *\([^ ]*\) *[^ ]* *\([^ ]*\).*/\1:\2/p"

А это второй :), но совсем другой...
set -- `/sbin/ifstat ppp0 -a | sed -n "s/ppp[0-9]//p"` && echo "$5:$7"
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: sed

Сообщение diesel »

Nab писал(а):
10.05.2006 19:03
А это второй :), но совсем другой...
set -- `cat ./test.txt | sed -n "s/ppp[0-9]//p"` && echo "$5:$7"


Тогда уже, если я правильно понял условие, то так:
cat test.txt |awk '/^ppp0/{print $6 ":" $8}'
Спасибо сказали:
Nab
Сообщения: 257

Re: sed

Сообщение Nab »

diesel писал(а):
10.05.2006 19:13
Тогда уже, если я правильно понял условие, то так:
cat test.txt |awk '/^ppp0/{print $6 ":" $8}'


Однозначно, так очень хорошо, только
/sbin/ifstat ppp0 -a |awk '/^ppp0/{print $6 ":" $8}'
хотя это роли не играет :)

Ну и я исходил из того что есть в наличии :)
про awk никто не говорил :)

Можно еще и перлом
/sbin/ifstat ppp0 -a | perl -wne '/ppp\d+\s+(\d+\s+){4}(\d+)\s+\d+\s+(\d+)\s+/ && print "$2:$3\n"'
:)

Но мне решение diesel с awk больше нравиться, да и вооще для таких простых задач awk самое то...
я тут с ним познакомился плотнее, так у меня простые счетные задачки получаются намного короче перловых хоть и немного медленнее.
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
Alexxx
Сообщения: 892
Статус: --==XXX==--
ОС: Archlinux current

Re: sed

Сообщение Alexxx »

Остановился на втором, который другой:) Вот окончательный вид скрипта

Код: Выделить всё

#!/bin/bash
#
L=$(date +%b-%G).log
set -- `/sbin/ifstat ppp0 | sed -n "s/ppp[0-9]//p"`
echo "$(date +%s):0:0:$5:$7" >> /var/log/adslstat/"$L"
Гораздо проще и элегантней моего "монстра" <_<
Огромное спасибо.
-------------------------
Век живи - век учись! :)
Спасибо сказали:
Аватара пользователя
polachok
Бывший модератор
Сообщения: 2199
Статус: главный форумный маргинал
ОС: gnu/linux

Re: sed

Сообщение polachok »

у меня такой вопрос
имею:
other/n6IEfU.mp3
[playing] #95/174 0:02 (1%)
volume:100% repeat: on random: off
хочу:
[p] other/n6IEfU.mp3 #95/174 0:02 (1%)
осилил только так:
`mpc | head -1 | colrm 50 100` `mpc | sed '1d;3d;2s/playing/p/;2s/paused/s/;2s/stopped/t/' `

Dave_Griffiths - Latiaxis
[p] #97/174 1:40 (62%)
И немедленно выпил.
Спасибо сказали:
Nab
Сообщения: 257

Re: sed

Сообщение Nab »

можно вот так

Код: Выделить всё

#!/bin/sh

FILE=`cat $1 | sed -n '1p'`
STATUS=`cat $1 | sed -n '2s/\[\(.*\)\].*/\1/;2s/playing/p/p;2s/paused/s/p;2s/stopped/t/p'`
TIME=`cat $1 | sed -n '2s/.*\]//p'`
echo "[$STATUS] $FILE $TIME"


И еще по разному можно, но лень...
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: sed

Сообщение elide »

(polachok @ May 10 2006, в 20:34) писал(а):хочу:
[p] other/n6IEfU.mp3 #95/174 0:02 (1%)
осилил только так:
`mpc | head -1 | colrm 50 100` `mpc | sed '1d;3d;2s/playing/p/;2s/paused/s/;2s/stopped/t/' `
судя по тому, что ты осилил - это совершенно неюзабельно в самостоятельном виде. а потому будет заворачиваться в скрипт с коротким именем, коий и будет юзаться. а ежели так, то почему бы не получать инфу прямо от mpd и не выводить ее в совершенно произвольной форме?
слава роботам!
Спасибо сказали:
Аватара пользователя
polachok
Бывший модератор
Сообщения: 2199
Статус: главный форумный маргинал
ОС: gnu/linux

Re: sed

Сообщение polachok »

2Nab
спасибо за помощь, не подумал
2elide
я эту штуку в панельку wmii3 запихал
И немедленно выпил.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: sed

Сообщение elide »

(polachok @ May 10 2006, в 22:05) писал(а):я эту штуку в панельку wmii3 запихал
у меня для этих же целей специальная штука есть. думаю, разберешься, что там к чему. гораздо большую гибкость дает. и гораздо проще, чем с седом извращаться.

Код: Выделить всё

#!/bin/gawk -f
######################################################################
# simple MusicPD client for WMii 3 ###################################
# elide@bk.ru (c) 2006             ###################################
######################################################################

function process(key, value){
        gsub(key " ", "", value)
        key=tolower(key)
        if(key ~ /state/)
                stat=value
        if(key ~ /time/)
                time=value
        if(key ~ /artist/)
                art=value
        if(key ~ /title/)
                ttl=value
}

BEGIN {
        ( NS = "/inet/tcp/0/127.0.0.1/6600" ) |& getline
        printf("command_list_ok_begin\ncurrentsong\nstatus\ncommand_list_end\n") |& NS
        while ((NS |& getline) > 0 && $1!="OK") process($1, $0)
        close(NS)
}

END {
        if(stat ~ /stop/)
                printf("[STOP]")
        else {
                if(stat ~ /play/){
                        split(time, ft, /:/)
                        ct = strtonum(ft[1])
                        tt = strtonum(ft[2])
                        stat = sprintf("[%d:%02d/%d:%02d]", ct/60, ct%60, tt/60, tt%60)
                } else
                        stat = "[" toupper(stat) "]"

                if(length(ttl)>25)
                        ttl = substr(ttl,0,22) "..."
                printf("%s - %s %s", art, ttl, stat)
        }
}
слава роботам!
Спасибо сказали: