Jak dostat do grepu argument z proměnné?

webhope

Jak dostat do grepu argument z proměnné?
« kdy: 05. 04. 2010, 17:08:05 »
Jak dostat do grepu argument z proměnné?

Původně jsem měl tento kod mimo funkci a fungoval:
Kód: [Vybrat]
d=" -e linux "
subdirs=$(find $main_dir -maxdepth 1 | grep -i  $d | sort --stable -k "1");
Nyní po přesunutí do funkce nefunguje. Proměnná je předána jako řetězec ne jako argument.

Toto taky nefunguje:
Kód: [Vybrat]
d=" -e linux "
subdirs=$(find $main_dir -maxdepth 1 | `grep -i  $d` | sort --stable -k "1");


Pakánek

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #1 kdy: 05. 04. 2010, 17:57:04 »
Zkus:
Kód: [Vybrat]
grep '$PROM' souborviz. http://tldp.org/LDP/abs/html/quoting.html

webhope

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #2 kdy: 05. 04. 2010, 18:49:34 »
Tohle nepomáhá
Kód: [Vybrat]
find $main_dir -maxdepth 1 | grep -i  '$d'

ego

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #3 kdy: 05. 04. 2010, 21:08:00 »
v apostrofech se neprovadi expanze promennych, takze
grep -i '$d'
bude hledat neco jako d za koncem radky, coz se obeavam, ze nenajde nikdy nic :).  Naopak
grep -i "$d"
bude fungovat podle ocekavani (v uvozovkach se promenne expanduji).

webhope

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #4 kdy: 05. 04. 2010, 21:22:44 »
Ego

Takže v  ''  se vyhodnocují regulární výrazy? Když říkáš že dolar se interpretuje jako konec řádky

No normální uvozovky jsem použil právě mimo funkci a to fungovalo. Ale uvnitř funkce to nefunguje. V promenne d je parametr "-e linux" nebo něco podobneho.


ego

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #5 kdy: 05. 04. 2010, 22:05:00 »
Teprve ted jsem si vsimnul, ze chces pres promennou d na cmdline grepu predat vic nez jeden parametr.  Pak pouzij
grep -i $d
(ale to -e je tam zpravidla zbytecne, viz. man grep)
Nelze rict, ze v uvozovkach se vyhodnocuji regularni vyrazy, to je nonsens.  grep vyhledava reg. vyraz, ktery dostane na cmdline.  At pouzijes uvozovky nebo apostrof, nic z toho nikdy grep neuvidi--"spolkne" to shell, jen to ridi, co shell grepu na cmdline preda.  A zjednodusene receno to v apostrofech mu preda 1:1 (beze zmeny), kdezto na tom v uvozovkach predtim provede mj. expanzi promennych.  Dulezite ale je uvedomit si, ze pokud udelas
grep -i "$d"
tak i kdyz promenna d bude obsahovat vice slov, grep pak techto vice slov dostane jako jeden parametr (a v tomto pripade to pochopi jako search pattern).  Proto, kdyz chces predat promennou obsahuji "-e linux" a chces, aby to grep dostal jako dva parametry, nesmis uvozovky pouzit vubec.

webhope

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #6 kdy: 05. 04. 2010, 22:17:37 »
Jenže při nastavování proměnné uvozovky použít musím. Proměnná může obsahovat více e parametrů.

Kód: [Vybrat]
d=" -e linux -e ext -e ext"
Do toho grepu to předávám už bez uvozovek, ale shell to grepu předává jak kdyby tam byly jednoduché uvozovky.

Kód příspěvku #1 vypisuje toto:
Kód: [Vybrat]
+++ find /sata -maxdepth 1
+++ grep ' -e xp -e win ' -i
+++ sort --stable -k 1
++ subdirs=

všimni si že řádek #2 to obdržel je v jednoduchych uvozovkach.
« Poslední změna: 05. 04. 2010, 22:20:58 od webhope webhope »

ego

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #7 kdy: 05. 04. 2010, 23:16:19 »
Kód: [Vybrat]
+++ grep ' -e xp -e win ' -i
Apostrofy v tomto vypisu vyjadruji jen to, ze to grep obdrzel jako jeden parametr, ale ver mi, obdrzel to bez apostrofu! :)

Mimochodem, v tomto vypisu je podezrele uz to, ze to co obdrzel grep, zacina mezerou, takze nejspis TO CELE (vcetne prvni a posledni mezery) pochopil jako pattern (protoze to nezacina pomlckou, to -e bere jako soucast pattern, coz asi nechces).

Rad pomuzu to doresit :), zkus to cele kdyztak prosim zredukovat na co nejmensi zdrojak, ktery nedela co by sis predstavoval, tj. vyhod z toho co tam nemusi byt (find, sort, ...), tak se to bude zkoumat nejlepe.

webhope

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #8 kdy: 05. 04. 2010, 23:33:29 »
Kód: [Vybrat]
function get_device {
d="-e xp -e win";
set -x
subdirs=$(find $main_dir -maxdepth 1 | grep $d -i | sort --stable -k "1");
echo $subdirs
}

get_device

Výsledek:
Kód: [Vybrat]
+++ find /sata -maxdepth 1
+++ grep '-e xp -e win' -i
+++ sort --stable -k 1
++ subdirs=
++ echo

ZJEDNODUŠENY KOD:
Kód: [Vybrat]
function get_device {
d="-e xp -e win";
set -x
find /mnt -maxdepth 1 | grep $d -i
}

get_device

Ten zjednodušený kód ale v shellu háže divný výstup na posledním řádku:

Kód: [Vybrat]
# function get_device {
> d="-e xp -e win";
> set -x
> find /mnt -maxdepth 1 | grep $d -i
> }
#
# get_device
+ grep --color -e xp -e win -i
+ find /mnt -maxdepth 1
++ echo -ne '\033]0;admin@localhost:/'

« Poslední změna: 05. 04. 2010, 23:59:35 od webhope webhope »

deadmail

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #9 kdy: 06. 04. 2010, 00:01:08 »
Kód: [Vybrat]
function get_device {
d="-e xp -e win";
set -x
      subdirs=$(find $main_dir -maxdepth 1 | grep $d -i | sort --stable -k "1");
echo $subdirs
}

get_device

Výsledek:
Kód: [Vybrat]
+++ find /sata -maxdepth 1
+++ grep '-e xp -e win' -i
+++ sort --stable -k 1
++ subdirs=
++ echo

ZJEDNODUŠENY KOD:
Kód: [Vybrat]
function get_device {
d="-e xp -e win";
set -x
      subdirs=$(find /mnt -maxdepth 1 | grep $d -i );
echo $subdirs
}

get_device

Fakt mi to rozum nebere



No u mna (GNU bash 3.2.39) to apostrofy nevypisuje ...

Kód: [Vybrat]
+ get_device
+ d='-e xp -e win'
+ set -x
++ grep -e xp -e win -i
++ find /mnt -maxdepth 1
+ subdirs=
+ echo

Cez regularny vyraz sa to da lahko obist:
Kód: [Vybrat]
d="xp|win"
find ... | egrep -i "$d" | sort --stable
Prepinac -k 1 je defaultne nastavenie sortu (tried podla celeho riadku), teda sa nemusi zapisovat

webhope

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #10 kdy: 06. 04. 2010, 00:09:19 »
Když tu funkci spustím z shellu tak to jede dobře - bez apostrofu

Script:
Kód: [Vybrat]
++ find /sata -maxdepth 1
nevypisuje nic

CMD Shellu:
Kód: [Vybrat]
++ find /sata -maxdepth 1

Vypisuje:
/sata
/sata/HRY
/sata/projekty
atd.

Tak mám to.

Chyba byla ve špatně nastaveném IFS. Respektive oddělovač je dobře, ale neuvědomil, jsme si, že jsem ho v tomto bloku nepřepnul. To mě nenapsalo, že tu může být kámen úrazu.

IFS=$'\n';
« Poslední změna: 06. 04. 2010, 00:37:30 od webhope webhope »

Kit

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #11 kdy: 06. 04. 2010, 06:48:09 »
Také se tam dají strčit všechny parametry funkce naráz:
Kód: [Vybrat]
subdirs=$(find $main_dir -maxdepth 1 | grep $@ | sort --stable -k "1");

webhope

A ještě řeším podobnou situaci
« Odpověď #12 kdy: 06. 04. 2010, 14:20:12 »
A ještě řeším podobnou situaci. Potřebuju do souboru zapsat zalomení řádku, ale místo toho se mi tam zapíše \n.

Kód: [Vybrat]
PADDING="\\n\\n\\n\\n";
new_line="$PADDING$new_line $directory  $fs  $zbytek";
echo $new_line >> /etc/fstab

Výsledek zapsaný do /etc/fstab:
\n\n\n\nUUID="E0D8A16ED8A1441E" /sata/XP2 ntfs-3g defaults,umask=000 0 0

deadmail

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #13 kdy: 06. 04. 2010, 16:01:26 »
Citace
Potřebuju do souboru zapsat zalomení řádku, ale místo toho se mi tam zapíše \n.

Kód: [Vybrat]
echo -e "prvy\ndruhy"

webhope

Re: Jak dostat do grepu argument z proměnné?
« Odpověď #14 kdy: 06. 04. 2010, 16:52:41 »
Joj, tak to je trapas. To už jsem dělal tolikrát a já na to zapomněl. Trapné. No