2013-11-28 3 views
1

Как я могу получить все «clid's», у которых есть «client_type = 0»? Труба char "|" разделяет каждую информацию клиента. Текст, который у меня есть только одна строка:Сценарий оболочки Linux: как совместить подстроку с регулярным выражением

CLID = 2 чид = 3346 client_database_id = 5153 client_nickname = xLukas \ s \ р \ sLukas client_type = 0 | CLID = 3 чид = 3346 client_database_id = 1 client_nickname = питание \ SBY \ sMirWayne.DE client_type = 1 | CLID = 4 чид = 3346 client_database_id = 9661 client_nickname = число \ Сона client_type = 0 | CLID = 5 чид = 3469 client_database_id = 1 client_nickname = питание \ SBY \ sMirWayne client_type = 1 | clid = 6 cid = 1716 client_database_id = 1 client_nickname = FG \ sBot client_type = 1 | clid = 7 cid = 3469 client_database_id = 9661 client_nickname = Number \ stwo client_type = 0 | clid = 8 cid = 1762 client_database_id = 4351client_nickname = pr0zkillz1x \ pTobi client_type = 0 | CLID = 9 чид = 1764 client_database_id = 5160 client_nickname = xL1mited \ s/\ Smax client_type = 0 | CLID = 10 чид = 1716 client_database_id = 9704 client_nickname = Sebi client_type = 0 | CLID = 13 чид = 3346 client_database_id = 4336 client_nickname = checker284 \ с \ р \ sSebbo client_type = 0 | CLID = 19 чид = тысяча семьсот шестьдесят-дв client_database_id = 9312 client_nickname = pr0skillz1x \ pDanie client_type = 0 | CLID = 30 чид = 3346 client_database_id = 9697 client_nickname = TeamSpeakUser client_type = 0 | CLID = 33 чид = 1716 client_database_id = 1 client_nickname = ServerAdmin client_type = 1

Мне нужен alle clid's, который имеет client_type = 0 в дополнительной строке. Например, как, что:

clid=2 
    clid=3 
    clid=4 
    clid=5 
    ... 

Мое текущее решение не работает:

cat clientlist.txt | grep -Eo "clid=[0-9]+[\d\D]*client_type=0" | grep -Eo "clid=[0-9]+" 

Может кто-нибудь помочь?

+1

'cat' файл в Grep? Конечно, ты шутишь! 'grep ... clientlist.txt | ... 'экономит около миллиарда циклов процессора за вызов. – Jens

+0

Что лучше? Я бы использовал каждое рабочее решение, но в настоящее время у меня нет. – user2966991

+0

Лучше избегать бесполезной кошки и бесполезной трубы. Вы не ездите с задействованными тормозами, или вы? – Jens

ответ

1

Труба символ "|" разделяет каждую информацию клиента.

Используя эту информацию, вы можете сказать:

tr '|' '\n' < clientlist.txt | grep -Po 'clid=\d+(?=.*client_type=0)' 

Для вашего входа, это было бы привести:

clid=2 
clid=4 
clid=7 
clid=8 
clid=9 
clid=10 
clid=13 
clid=19 
clid=30 
1

Использование СЭД:

tr '|' '\n' < file | sed -n '/client_type=0/s/\(clid=[0-9]*\).*$/\1/p' 
clid=2 
clid=4 
clid=7 
clid=8 
clid=9 
clid=10 
clid=13 
clid=19 
clid=30 
+0

закрыть, но не совсем - вам нужно обработать разделитель, поэтому правильная версия - 'sed -n -e 's/|/\ n /' -e '/ client_type = 0/s/\ (clid = [0 -9] * \). * $/\ 1/p'' –

+0

@OliverMatthews: Спасибо, я обновил, я подумал, что есть новые строки после записи в входном файле. – anubhava

+0

Я начал использовать 'grep' чаще, глядя на ваши сообщения, вы, кажется, отказались от него! – devnull

Смежные вопросы