Автор Тема: проверка свободно име ( bash )  (Прочетена 2572 пъти)

mrowcp

  • Напреднали
  • *****
  • Публикации: 450
    • Профил
Здравейте отново :)
Идеята този път е следната:

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
.....

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

Some Things Just Are The Way They Are

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: проверка свободно име ( bash )
« Отговор #1 -: 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
Активен

0x2B|~0x2B

mrowcp

  • Напреднали
  • *****
  • Публикации: 450
    • Профил
Re: проверка свободно име ( bash )
« Отговор #2 -: 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:~#
Активен

Some Things Just Are The Way They Are

betso

  • Напреднали
  • *****
  • Публикации: 281
    • Профил
Re: проверка свободно име ( bash )
« Отговор #3 -: 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
Успех! :)
Активен

mrowcp

  • Напреднали
  • *****
  • Публикации: 450
    • Профил
Re: проверка свободно име ( bash )
« Отговор #4 -: Aug 23, 2010, 16:49 »
Мерси и на двамата, работи идеално ;) Ако имате път към Плд обадете се да черпя по  [_]3
Активен

Some Things Just Are The Way They Are

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: проверка свободно име ( bash )
« Отговор #5 -: Aug 23, 2010, 16:51 »
Мерси и на двамата, работи идеално ;) Ако имате път към Плд обадете се да черпя по  [_]3
Ако имаш път през Прага се обади да пием по едно :)
Активен

0x2B|~0x2B

mrowcp

  • Напреднали
  • *****
  • Публикации: 450
    • Профил
Re: проверка свободно име ( bash )
« Отговор #6 -: Aug 25, 2010, 11:09 »
За да не отварям нова тема, искам да питам тук:

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

Код:
#cat file.txt

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

#cat file.txt |grep Godini
Ime Username
Активен

Some Things Just Are The Way They Are

romeo_ninov

  • Напреднали
  • *****
  • Публикации: 2155
    • Профил
Re: проверка свободно име ( bash )
« Отговор #7 -: Aug 25, 2010, 11:31 »
За да не отварям нова тема, искам да питам тук:

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

Код:
#cat file.txt

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

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

0x2B|~0x2B

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: проверка свободно име ( bash )
« Отговор #8 -: 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 ;)
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

mrowcp

  • Напреднали
  • *****
  • Публикации: 450
    • Профил
Re: проверка свободно име ( bash )
« Отговор #9 -: 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

Активен

Some Things Just Are The Way They Are

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: проверка свободно име ( bash )
« Отговор #10 -: Aug 25, 2010, 12:27 »
@mrowcp, човек ти имаш 3 записа само. Кое тисе струва грешно. Я сложи 15-20 реда и виж пак.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: проверка свободно име ( bash )
« Отговор #11 -: 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 реда - търсеният и реда под него (няма да добави и четвъртия ред, тъй като той не съществува). При това положение, ползвайки командата с параметри, с които се очаква да изведеш на екрана реда, който е два реда по-надолу от търсения, ще изведеш на екрана реда, който е под търсения, тъй като той е последен във файла.
« Последна редакция: Aug 25, 2010, 13:54 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

mrowcp

  • Напреднали
  • *****
  • Публикации: 450
    • Профил
Re: проверка свободно име ( bash )
« Отговор #12 -: Aug 25, 2010, 14:45 »
Ахаааа  ;D Мерси за изчерпателния отговор.Както е тръгнало няма да мога да смогна на черпене на  [_]3  :D
Активен

Some Things Just Are The Way They Are

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
BASH: Как да поддържам една програма работеща
Общ форум
Regia 1 9250 Последна публикация Feb 16, 2005, 08:51
от
bash
Настройка на програми
tuxi 7 4764 Последна публикация Jun 11, 2005, 19:12
от tuxi
Моля за малко помощ за BASH
Настройка на програми
bonbon 3 3535 Последна публикация Dec 04, 2005, 16:37
от bonbon
BASH
Общ форум
Dean79 3 3677 Последна публикация Jan 13, 2006, 00:24
от Dean79
Bash присвояване на стойност от файл
Общ форум
Pulear 6 4293 Последна публикация May 21, 2006, 17:20
от Pulear