Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: mrowcp в Aug 22, 2010, 20:40



Титла: проверка свободно име ( bash )
Публикувано от: mrowcp в Aug 22, 2010, 20:40
Здравейте отново :)
Идеята този път е следната:

cat file.txt
user1
user2
user3
user4
user5
user9
user8
user10
....
....
user51

искам да задам някакъв рейндж пр. user1-user55 и скрипта да ми върне само не заетите ( свободни ) имена.
Мисля, че ще е нещо като:

Код:
cat users.log | while read user
 do
result=$user
cat users.log | grep $user
if [ $? -ne 1 ] ; then
.....

но не знам как да закача рейнджа който да проверява :( .И как точно да става тази проверка?
Мерси


Титла: Re: проверка свободно име ( bash )
Публикувано от: romeo_ninov в Aug 22, 2010, 23:35
има програма seq за генериране на цифрови поредици
и не е ли по-просто вместо
Код:
cat users.log | while read user
...
done
да е
Код:
while read user
---
done<users.log
и вместо
Код:
cat users.log | grep $user
така
Код:
grep $user  users.log


Титла: Re: проверка свободно име ( bash )
Публикувано от: mrowcp в Aug 23, 2010, 01:06
има програма seq за генериране на цифрови поредици
и не е ли по-просто вместо
Код:
cat users.log | while read user
...
done
да е
Код:
while read user
---
done<users.log
и вместо
Код:
cat users.log | grep $user
така
Код:
grep $user  users.log

Определено обясненията не са ми силната страна :)
Аз имам вече файл, искам да го чета и резултата да е именомер на потребител който го няма в списъка:

Код:
cat file.txt
user1
user3
user4
user6
user7

./script.sh
user2
user5

bash:~#


Титла: Re: проверка свободно име ( bash )
Публикувано от: betso в Aug 23, 2010, 02:32
Нещо от сорта би могло да ти свърши работа, използвайки споменатия от romeo_ninov seq:
Цитат
for i in `seq 1 51`
do
   grep -q user$i users.log
   if [ $? -ne 0 ]
   then
       echo "user$i"
   fi
done
Успех! :)


Титла: Re: проверка свободно име ( bash )
Публикувано от: mrowcp в Aug 23, 2010, 16:49
Мерси и на двамата, работи идеално ;) Ако имате път към Плд обадете се да черпя по  [_]3


Титла: Re: проверка свободно име ( bash )
Публикувано от: romeo_ninov в Aug 23, 2010, 16:51
Мерси и на двамата, работи идеално ;) Ако имате път към Плд обадете се да черпя по  [_]3
Ако имаш път през Прага се обади да пием по едно :)


Титла: Re: проверка свободно име ( bash )
Публикувано от: mrowcp в Aug 25, 2010, 11:09
За да не отварям нова тема, искам да питам тук:

как да извадя предишни или следващи редове?Пример:

Код:
#cat file.txt

.....
Ime Username
Godini 10
Adres 5 Street
.....

#cat file.txt |grep Godini
Ime Username


Титла: Re: проверка свободно име ( bash )
Публикувано от: romeo_ninov в Aug 25, 2010, 11:31
За да не отварям нова тема, искам да питам тук:

как да извадя предишни или следващи редове?Пример:

Код:
#cat file.txt

.....
Ime Username
Godini 10
Adres 5 Street
.....

#cat file.txt |grep Godini
Ime Username
на sed има команда next, но за предишен ред нямам идея. Т.е. имам, но става доста сложно :)


Титла: Re: проверка свободно име ( bash )
Публикувано от: neter в Aug 25, 2010, 12:02
Командата grep има параметри --before-context и --after-context (съответно в кратък вариант -B и -A). Можеш да ползваш тях, след което съответно с head и tail да си вземаш нужните редове. Примери:
1. ако искаш да вземеш реда над търсения
Код
GeSHi (Bash):
  1. grep -B 1 'търсен текст' file | head -n 1
2. ако искаш да вземеш реда след търсения
Код
GeSHi (Bash):
  1. grep -A 1 'търсен текст' file | tail -n 1
3. ако искаш да вземеш реда, който е два реда по-нагоре от търсения
Код
GeSHi (Bash):
  1. grep -B 2 'търсен текст' file | head -n 1
и т.н.
Ако искаш да вземаш по повече от един ред, променяй стойноста за head и tail ;)


Титла: Re: проверка свободно име ( bash )
Публикувано от: mrowcp в Aug 25, 2010, 12:17
Командата grep има параметри --before-context и --after-context (съответно в кратък вариант -B и -A). Можеш да ползваш тях, след което съответно с head и tail да си вземаш нужните редове. Примери:
1. ако искаш да вземеш реда над търсения
Код
GeSHi (Bash):
  1. grep -B 1 'търсен текст' file | head -n 1
2. ако искаш да вземеш реда след търсения
Код
GeSHi (Bash):
  1. grep -A 1 'търсен текст' file | tail -n 1
3. ако искаш да вземеш реда, който е два реда по-нагоре от търсения
Код
GeSHi (Bash):
  1. grep -B 2 'търсен текст' file | head -n 1
и т.н.
Ако искаш да вземаш по повече от един ред, променяй стойноста за head и tail ;)

Мерси за подробното инфо :) След малко тестове, интересно че синтаксиса е верен,но:

Код:
> grep -B 1 Godini test.txt | head -n 1
Ime Username
> grep -A 1 Godini test.txt | head -n 1
Godini 10
> cat test.txt
Ime Username
Godini 10
Adres 5 Street
> grep -A 1 Godini test.txt | head -n 2
Godini 10
Adres 5 Street
> grep -A 1 'Godini' test.txt | head -n 1
Godini 10
> grep -A 1 'Godini' test.txt | head -n 2
Godini 10
Adres 5 Street
> grep -A 2 'Godini' test.txt | head -n 1
Godini 10



Титла: Re: проверка свободно име ( bash )
Публикувано от: b2l в Aug 25, 2010, 12:27
@mrowcp, човек ти имаш 3 записа само. Кое тисе струва грешно. Я сложи 15-20 реда и виж пак.


Титла: Re: проверка свободно име ( bash )
Публикувано от: neter в Aug 25, 2010, 13:34
grep -A 1 Godini test.txt | head -n 1
Това е грешна комбинация за твоите цели. Да дообясня. Командата head взема N на брой редове от горната част на изхода. Командата tail взема N на брой редове от долната част на изхода. За твоите цели трябва да ползваш head и tail със съответстващите им по посока параметри на grep. Т.е., ако искаш да вземеш горен ред, ползваш параметъра -B на grep в комбинация с командата head. Ако искаш да вземеш долен ред, ползваш параметъра -A на grep в комбинация с командата tail. Ето как се четат командите:
Код
GeSHi (Bash):
  1. grep -B 2 'търсен текст' file | head -n 1
Чете се - вземи допълнително 2 реда над търсения текст и покажи най-горния от тях, с което на екрана виждаме реда, който е 2 реда по-нагоре от търсения.
Код
GeSHi (Bash):
  1. grep -A 2 'търсен текст' file | tail -n 1
Чете се - вземи допълнително 2 реда под търсения текст и покажи най-долния от тях, с което на екрана виждаме реда, който е 2 реда по-надолу от търсения.
Ако все още не разбираш, спри се малко и помисли логически ;)

P.S.: За досхващане, ето какво се случва при изпълнението на грешната комбинация
Код
GeSHi (Bash):
  1. grep -A 1 Godini test.txt | head -n 1
Началото на командата (частта преди правата черта) извежда това:
Цитат
Godini 10
Adres 5 Street
След това head казва да се изведе най-горният ред от този изход, при което получаваш това
Цитат
Godini 10
А си очаквал да получиш това
Цитат
Adres 5 Street
Ще получиш нужния ред, ако вместо най-горния ред, кажеш на командата да изведе най-долния ред (т.е., вместо head, трябва да ползваш tail).

И едно допълнение за случая, когато файлът не съдържа толкова редове, колкото сме опитали да извикаме. Т.е., ако файлът съдържа (номерирам редовете за улеснение)
Цитат
1. Ime Username
2. Godini 10
3. Adres 5 Street
И ние извикваме командата
Код
GeSHi (Bash):
  1. grep -A 2 'търсен текст' file | tail -n 1
Тогава началото на командата (частта преди правата черта) ще се опита да изведе това
Цитат
2. Godini 10
3. Adres 5 Street
4. втори допълнителен ред
Ред номер 4 ще бъде извикан за показване, тъй като "-A 2" означава да се вземе търсеният ред плюс още два реда след него. Тогава втората част на командата (tail) би трябвало да вземе ред номер 4, тъй като той е най-отдолу (tail чете отдолу нагоре). Но, тъй като в случая ред 4 не съществува, файлът ни приключва с третия ред, то на екрана ще се изведе ред 3 (Adres 5 Street), тъй като tail ще вземе най-долния ред, а grep ще му е предоставил 2 реда - търсеният и реда под него (няма да добави и четвъртия ред, тъй като той не съществува). При това положение, ползвайки командата с параметри, с които се очаква да изведеш на екрана реда, който е два реда по-надолу от търсения, ще изведеш на екрана реда, който е под търсения, тъй като той е последен във файла.


Титла: Re: проверка свободно име ( bash )
Публикувано от: mrowcp в Aug 25, 2010, 14:45
Ахаааа  ;D Мерси за изчерпателния отговор.Както е тръгнало няма да мога да смогна на черпене на  [_]3  :D