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

Програмиране => Общ форум => Темата е започната от: martos в Dec 10, 2010, 12:01



Титла: BASH compare help
Публикувано от: martos в Dec 10, 2010, 12:01
Здравейте,

Търся простичък начин за сравняването на резултатите от изпълнението на две команди и извеждането на разликите, ако има такива. Резултатът и от двете команди е списък IP адреси, по един на ред.

Някакви насоки?


Титла: Re: BASH compare help
Публикувано от: ROKO__ в Dec 10, 2010, 12:07
Здравейте,

Търся простичък начин за сравняването на резултатите от изпълнението на две команди и извеждането на разликите, ако има такива. Резултатът и от двете команди е списък IP адреси, по един на ред.

Някакви насоки?

Не ти разбрах точно въпроса. Искаш скрипта после да те пита за два отделни параметъра от които изхода да е на два отделни реда ?


Титла: Re: BASH compare help
Публикувано от: b2l в Dec 10, 2010, 12:08
Здравейте,

Търся простичък начин за сравняването на резултатите от изпълнението на две команди и извеждането на разликите, ако има такива. Резултатът и от двете команди е списък IP адреси, по един на ред.

Някакви насоки?

man dd

PS: diff исках да кажа.


Титла: Re: BASH compare help
Публикувано от: bop_bop_mara в Dec 10, 2010, 12:18
Здравейте,

Търся простичък начин за сравняването на резултатите от изпълнението на две команди и извеждането на разликите, ако има такива. Резултатът и от двете команди е списък IP адреси, по един на ред.

Някакви насоки?

Код:
man dd
???

@martos т.е. трябва ти нещо като diff/cmp но не за файлове, а за низове?


Титла: Re: BASH compare help
Публикувано от: laskov в Dec 10, 2010, 12:19
dd няма нищо общо. Виж diff като първо може би sort


Титла: Re: BASH compare help
Публикувано от: martos в Dec 10, 2010, 12:48
Нека обясня малко по-добре:)

Имам команда1 с изход:

Код:
192.168.1.5
192.168.2.5
192.168.4.52
192.168.4.53
192.168.6.15
192.168.19.15

Команда2 с изход:

Код:
192.168.1.5
192.168.2.5
192.168.6.15
192.168.19.15

Искам да получа като резултат:
Код:
192.168.4.52
192.168.4.53


Титла: Re: BASH compare help
Публикувано от: koue в Dec 10, 2010, 12:50
Първо изпълни sort -n на двата списъка, после ако се налага (според условието) изпълни uniq на двата списъка и след това им направи diff.


Титла: Re: BASH compare help
Публикувано от: bop_bop_mara в Dec 10, 2010, 13:10
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. out1=`command1 arg11 arg12 ...`
  4. out2=`command2 arg21 arg22 ...`
  5.  
  6. for word in $out1
  7. do
  8. grep $word <<<"$out2" > /dev/null || echo $word
  9. done
  10.  

Това взима изходите от 2те команди, записва ги в по една променлива (внимание - новите редове стават на спейсове). Обикаля всяка отделна дума в 1вата променлива и я търси във втората, ако не я намери, я изпизва на ст. изход. За твоя случай (понеже IP-тата са 1 дума) трябва да работи. Ако ти трябва не само да ти покаже кои от 1вия списък не се срещат във 2рия, ами и кои от 2рия не се срещат в 1вия, повтаряш for-а, заменяйки out1 с out2 и обратно.
Заради <<< това работи на bash, но не и на стандартен shell, засега не се сещам как да се заобиколи, но предполагам, че може.

@koue - сорт, uniq, diff работят с файлове. Т.е. става и с тях, но трябва изходите от командите да се записват във файлове, а засега martos не е казал, че иска това :)


Титла: Re: BASH compare help
Публикувано от: martos в Dec 10, 2010, 14:50
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. out1=`command1 arg11 arg12 ...`
  4. out2=`command2 arg21 arg22 ...`
  5.  
  6. for word in $out1
  7. do
  8. grep $word <<<"$out2" > /dev/null || echo $word
  9. done
  10.  

Това взима изходите от 2те команди, записва ги в по една променлива (внимание - новите редове стават на спейсове). Обикаля всяка отделна дума в 1вата променлива и я търси във втората, ако не я намери, я изпизва на ст. изход. За твоя случай (понеже IP-тата са 1 дума) трябва да работи. Ако ти трябва не само да ти покаже кои от 1вия списък не се срещат във 2рия, ами и кои от 2рия не се срещат в 1вия, повтаряш for-а, заменяйки out1 с out2 и обратно.
Заради <<< това работи на bash, но не и на стандартен shell, засега не се сещам как да се заобиколи, но предполагам, че може.

@koue - сорт, uniq, diff работят с файлове. Т.е. става и с тях, но трябва изходите от командите да се записват във файлове, а засега martos не е казал, че иска това :)


Едно ОГРОМНО БЛАГОДАРЯ!;)


Титла: Re: BASH compare help
Публикувано от: sstefanov в Dec 10, 2010, 15:30
Ако резултатите са във файлове f1 и f2 съответно, то следната команда прави това, което искаш:

grep -v -f f2 f1


Титла: Re: BASH compare help
Публикувано от: martos в Dec 11, 2010, 09:45
Трябваше ми решение без файлове. Вариантът на bop_bop_mara ми свърши перфектна работа:)


Титла: Re: BASH compare help
Публикувано от: radoulov в Dec 11, 2010, 10:49
Трябваше ми решение без файлове.
[...]

Код:
grep -fv <(cmd2) <(cmd1)