URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8544
[ Назад ]

Исходное сообщение
"Сделать выборку"

Отправлено rahc , 10-Дек-09 13:18 
Никак не могу понять как  сделать такое:
есть список
12261 ?        S  0:00 ora_q001_123
12985 ?        S 60:50 ora_j002_123
13821 ?        S  1:16 ora_j003_123
13930 ?        S  0:12 ora_j004_123
17656 ?        S  0:00 ora_reco_321
17658 ?        S  0:02 ora_cjq0_321
17660 ?        S 13:59 ora_arc0_321
17662 ?        S 46:27 ora_arc1_321
23943 ?        S  0:10 ora_psp0_213
23945 ?        S  0:00 ora_mman_213
23947 ?        S  4:30 ora_dbw0_213
23949 ?        S  2:13 ora_lgwr_213
как мне сделать выборку с выводом списка вида:
sid
123
321
213

и без повторов
Спасибо


Содержание

Сообщения в этом обсуждении
"Сделать выборку"
Отправлено niXman , 10-Дек-09 13:40 
>sid

это кто такой?


"Сделать выборку"
Отправлено rahc , 10-Дек-09 13:41 
>>sid
>
>это кто такой?

это oracle_sid
написал для примера он может быть как буквенный так и цифровой



"Сделать выборку"
Отправлено niXman , 10-Дек-09 13:50 
>это oracle_sid

мне это ни о чем не говорит :)
щас парсинг и унификацию числовых строк напишу.


"Сделать выборку"
Отправлено niXman , 10-Дек-09 16:26 
>>sid
>
>это кто такой?

#include <string>
#include <vector>
#include <set>
#include <algorithm>
#include <iterator>
#include <fstream>
#include <iostream>

#include <cerrno>
#include <cstring>

std::vector<std::string> parse(const std::vector<std::string>& slist) {
    std::set<std::string> unique_strings;
    std::vector<std::string>::const_iterator it = slist.begin();

    for ( ; it != slist.end(); ++it ) {
        std::string::size_type pos = it->rfind('_');
        if ( pos == std::string::npos ) continue;
        unique_strings.insert(it->substr(pos+1));
    }

    return std::vector<std::string>(unique_strings.begin(), unique_strings.end());
}

int main(int argc, char** argv) {
    if ( argc != 2 ) {
        std::cerr << "expected file name!" << std::endl;
        return 0;
    }

    std::ifstream file(argv[1]);
    if ( !file ) {
        std::cerr << "can`t open file: " << strerror(errno) << std::endl;
        return errno;
    }

    std::vector<std::string> in;
    while ( !file.eof() ) {
        std::string tmp;
        std::getline(file, tmp);
        in.push_back(tmp);
    }

    std::vector<std::string> out = parse(in);

    std::copy(out.begin(), out.end(), (std::ostream_iterator<std::string>(std::cout, "\n")));

    return 0;
}

ищет первый подчерк с конца строки. унифицирует числа.


"Сделать выборку"
Отправлено rahc , 10-Дек-09 16:40 

>ищет первый подчерк с конца строки. унифицирует числа.

это спасибо я и сам мог написать но на СИ мне не нужно(((
только шел чтоб человек т.е. начальник мог понимать что там написанно
на СИ он не рубец(


"Сделать выборку"
Отправлено niXman , 10-Дек-09 16:57 
>
>>ищет первый подчерк с конца строки. унифицирует числа.
>
>это спасибо я и сам мог написать но на СИ мне не
>нужно(((
>только шел чтоб человек т.е. начальник мог понимать что там написанно
>на СИ он не рубец(

это с++ ;)


"Сделать выборку"
Отправлено rahc , 10-Дек-09 16:42 
тем более ваш код не будет откомпелированн без напильника по крайне мере в solaris)

"Сделать выборку"
Отправлено niXman , 10-Дек-09 16:59 
>тем более ваш код не будет откомпелированн без напильника по крайне мере
>в solaris)

вам знакомо слово "стандарт" ? так вот у с++ есть стандарт обязывающий всех производителей с++ компиляторов соблюдать его. а солярис его хорошо соблюдает ;)


"Сделать выборку"
Отправлено rahc , 10-Дек-09 17:20 
>>тем более ваш код не будет откомпелированн без напильника по крайне мере
>>в solaris)
>
>вам знакомо слово "стандарт" ? так вот у с++ есть стандарт обязывающий
>всех производителей с++ компиляторов соблюдать его. а солярис его хорошо соблюдает
>;)

с этим я с вами полностью согласен
--enable-languages=c++ я не добавлял!
мне нужно было на shell или bash
я это добился вроде)))


"Сделать выборку"
Отправлено niXman , 10-Дек-09 17:47 
>[оверквотинг удален]
>>>в solaris)
>>
>>вам знакомо слово "стандарт" ? так вот у с++ есть стандарт обязывающий
>>всех производителей с++ компиляторов соблюдать его. а солярис его хорошо соблюдает
>>;)
>
>с этим я с вами полностью согласен
>--enable-languages=c++ я не добавлял!
>мне нужно было на shell или bash
>я это добился вроде)))

Все равно спасибо :)


"Сделать выборку"
Отправлено rahc , 10-Дек-09 18:00 
>[оверквотинг удален]
>>>вам знакомо слово "стандарт" ? так вот у с++ есть стандарт обязывающий
>>>всех производителей с++ компиляторов соблюдать его. а солярис его хорошо соблюдает
>>>;)
>>
>>с этим я с вами полностью согласен
>>--enable-languages=c++ я не добавлял!
>>мне нужно было на shell или bash
>>я это добился вроде)))
>
>Все равно спасибо :)

тебе спасибо за старания) удачного вечера


"Сделать выборку"
Отправлено Slavaz , 10-Дек-09 13:50 
... | sed -r 's/.*\s*ora_.*_(\d*)/\1/' | sort | uniq

"Сделать выборку"
Отправлено rahc , 10-Дек-09 13:52 
>... | sed -r 's/.*\s*ora_.*_(\d*)/\1/' | sort | uniq

в solaris нет параметра -r ( я так пробовал


"Сделать выборку"
Отправлено Slavaz , 10-Дек-09 13:58 
>>... | sed -r 's/.*\s*ora_.*_(\d*)/\1/' | sort | uniq
>
>в solaris нет параметра -r ( я так пробовал

В Солярке есть маны? :)

... | sed  's/.*_\(\d*\)/\1/' | sort | uniq


"Сделать выборку"
Отправлено rahc , 10-Дек-09 14:01 
>>>... | sed -r 's/.*\s*ora_.*_(\d*)/\1/' | sort | uniq
>>
>>в solaris нет параметра -r ( я так пробовал
>
>В Солярке есть маны? :)
>
>... | sed  's/.*_\(\d*\)/\1/' | sort | uniq

да но увы(
$ cat e.sh
cat /tmp/stat|sed 's/.*\s*ora_.*_(\d*)/\1/'| sort | uniq
$ ./e.sh
sed: command garbled: s/.*\s*ora_.*_(\d*)/\1/

--


"Сделать выборку"
Отправлено rahc , 10-Дек-09 14:09 
>[оверквотинг удален]
>>
>>... | sed  's/.*_\(\d*\)/\1/' | sort | uniq
>
>да но увы(
>$ cat e.sh
>cat /tmp/stat|sed 's/.*\s*ora_.*_(\d*)/\1/'| sort | uniq
>$ ./e.sh
>sed: command garbled: s/.*\s*ora_.*_(\d*)/\1/
>
>--

да тут разобрался спасибо работает
НО есть всегда
в выборке могут присутствовать записи вида 123_new
данный пример выведет только new(


"Сделать выборку"
Отправлено rahc , 10-Дек-09 14:24 
и возможно ли каждый параметр в выборке присваивать в переменную например $s
для дальнейшей манипуляции ими

"Сделать выборку"
Отправлено rahc , 10-Дек-09 14:45 
>и возможно ли каждый параметр в выборке присваивать в переменную например $s
>
>для дальнейшей манипуляции ими

/usr/ucb/ps -ax|grep ora_|sed 's/.*_\(\d*\)/\1/'|sort -u
пока что так


"Сделать выборку"
Отправлено rahc , 10-Дек-09 16:08 
вобщем вот выкладываю на всеобщее обозрение что у меня получилось
идея была просто нужна была возможность просмотреть на сервере Работающие на данный момент ORACLE_SID на сервере могут появляться новые базы и также исчезать(для тестов)
и чтоб быть в курсе всех событий было задуманно сделать следующее:
комманда stat и status

$ cat stat
#!/bin/bash
#i=`echo SID   ............   Status `
#echo $i
/usr/ucb/ps -ax|grep ora_ |sed 's/.*_\(\D*\)/\status \1/'|sort -u >/tmp/stats
chmod +x /tmp/stats
cat /tmp/stats
/tmp/stats >/tmp/Rep
rm /tmp/stats
i=`echo SID   ............   Status `
echo $i
cat /tmp/Rep|grep OPEN
cat /tmp/Rep|grep MOUNTED
rm /tmp/Rep

$ cat status
#!/bin/bash
#
#IBSO

if [ $# -eq 0 ]; then
echo "Status ORACLE_SID Graber";
date
else

sqlplus /nolog <<EOF
conn sys/sys@$1 as sysdba;
select host_name, instance_name, status from gv\$instance;
exit;
EOF
fi

Вот такие пироги если есть чем дополнить подсказывайте.
Понимаю что сделанно на коленке но главное цель достигнута!


"Сделать выборку"
Отправлено аноним , 10-Дек-09 21:15 
>как мне сделать выборку с выводом списка вида:
>sid
>123
>321
>213

В данном случае

| sed 's|.*_||' | sort -u