Sziasztok!
PHP-ból kellene egy shell parancsot gyártanom, ami több feltételeknek megfelelő fájlokat keres egy adott könyvtárban
Tudom, hogy megoldható lenne annyi lépésben, amennyi feltétel szerint keresek, de én egy lépésben szeretném.
Nahh magyarul ezt szeretném:
Egy adott könyvtárban szeretném látni az összes olyan file-t, amiben szerepel az
a=1
és a
b=2
és a
c=3
sor.
A grep-pel az a baj, hogy csak 2 feltételig műxik jól így:
grep -l "a=1" `grep -l "b=2" path/to/dir`
Ez már nem megy:
grep -l "a=1" `grep -l "b=2" `grep "c=3" /path/to/dir``
Hogyan lehetne rávenni a rendszert, hogy több egymásba ágyazott parancsot is kezeljen le?
Előre is köszi:
hemu
- 3536 megtekintés
Hozzászólások
Védd le \-sel a legbelső ` jeleket.
---------------
"I do not know with what weapons World War III will be fought, but World War IV will be fought with sticks and stones." - A. Einstein
- A hozzászóláshoz be kell jelentkezni
Mármint mindegyiket, ami az első ` jelen belül van?
Megpróbáltam és nem akarja az igazságot.
Így nézett ki a parancs:
grep -l "adatok\['VGA foglalat'\] = 'AGP8X'" `grep -l "adatok\['I ntegrált VGA'\] = 'Nincs'" \`grep -l "adatok\['Processzor foglalat'\] = 'Socket 478'" /path/*\``
- A hozzászóláshoz be kell jelentkezni
Szerk : a lenyeget lentebb mar irtak.
Ez esetben inkabb $() Pl.
`alma`korte`dio`- lehet ugy ertelmezni hogy $(alma)korte$(dio) de lehet ugy is,
hogy $(alma$(korte)dio). Ezert jobb a egymasba agyazas eseten a $().
A shell az `alma`korte`dio`-t az elsonek veszi, mig ezt `alma\`korte\`dio` a masodiknak, de meg egy szint es mar a csuda se latja at.
Amugy mindegyik a kurrens shellben hajtodik vegre, nincs subshell.
De biza, mindkettonel van subshell. :P
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.
- A hozzászóláshoz be kell jelentkezni
Szerintem fogalmazd meg reguláris kifejezéssel. Valahogy így:
grep -e '^(a=1|a=2|a=3)'
Mondjuk ez így érzésre rossz, de valami hasonló.
- A hozzászóláshoz be kell jelentkezni
Ezzel az a baj, hogy nekem olyan file-ok kellenek, amikben mindhárom sor szerepel.
Szóval olyan file-okat keresek, amiben szerepel az a=1 és a b=2 és a c=3 is.
Gondolom - lehet, hogy rosszul - a grep-pel lehet egy sorra keresni, de a találatokat tovább kell grep-elni a második, majd harmadik mintára, hogy végül csak azok a file-ok maradjanak meg, amik tartalmazzák mindhárom sort.
- A hozzászóláshoz be kell jelentkezni
Most akkor nem egy sorban kell szerepelnie mindhárom dolognak? Mert akkor grep-pel nem fog menni
---------------
"I do not know with what weapons World War III will be fought, but World War IV will be fought with sticks and stones." - A. Einstein
- A hozzászóláshoz be kell jelentkezni
Így van, nem egy sorban kell legyen, hanem a 3 minta mindegyike elő kell forduljon egy file-ban.
- A hozzászóláshoz be kell jelentkezni
awk-t használnám:
awk '/a=1/ {va=1;}; /b=2/ {vb=1;}; /c=3/ {vc=1}; END {if((va==1)&&(vb==1)&&(vc==1)) printf("%s\n",FILENAME); }'
vagy valami ilyesmi, nem próbáltam ki
- A hozzászóláshoz be kell jelentkezni
Huhh!
awk-hoz nem volt még szerencsém, annak egy filetartalma kell legyen a bemenete?
Vagy filenevet kell megadni?
- A hozzászóláshoz be kell jelentkezni
Mindkettő lehet, de a fenti tipp kihasználja hogy fájlt adtál meg (FILENAME változó) így egyesével lehet meghívni a fájlokra.
awk 'parancsok' fájlnév
- A hozzászóláshoz be kell jelentkezni
Ágyúval verébre módszereket próbálsz:
grep -e 'a=1' file | grep -e 'a=2' | grep -e 'a=3'
annyi grep egy csőben, ahány feltételed van.
- A hozzászóláshoz be kell jelentkezni
Ez igaz, de sajna nem egy file-ban keresek, hanem egy könyvtárban, aminek az eredménye az, hogy a pipe nem tud működni, legalábbis nem így, mivel a beömlő adatok filenevek.
- A hozzászóláshoz be kell jelentkezni
ha a backticket akarod kiváltani, akkor azt így lehet:
grep -l "a=1" $(grep -l "b=2" $(grep "c=3" /path/to/dir))
- A hozzászóláshoz be kell jelentkezni
És igen! Köszönöm!
- A hozzászóláshoz be kell jelentkezni
Úgy nézem ez a tipp még nem volt:
grep -l a=1 * | xargs -d \\n -- grep -l b=2 | xargs -d \\n -- grep -l c=3
:-)
--
hup.user.js
- A hozzászóláshoz be kell jelentkezni
Szeritem rossz celt tuzol ki magad ele. Ha PHP, ird php-ben. Van file kezeles, van regexp, mi kell meg? Lehet persze kicsit koltsegesebben shellben is, de 1) lassab.
2) kevesbe hordozhato 3) nem egyszerubb.
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy nem jó a cél, de jelen esetben ez tűnt "olcsóbbnak".
Jópár php file-ban kell keresgélni, amik adatbázisadatok statikus "klónjai".
Valóban kevésbé hordozható, de itt nem is szükséges.
Nekem nem tűnik lassabbnak, mint a php-s sőt.
Mivel a megoldás fele már megvolt fejben, nem akartam átdolgozni az egészet file kezelésre.
Így végül 15 perc alatt meglett az egyszerű megoldás, hogy a ` karaktert mire cseréljem a parancsban és működik. Ha a php-val dolgoztatom fel a fileokat egyenként, az azért megdobja még egy kis idővel az egészet - gondolom.
- A hozzászóláshoz be kell jelentkezni