Tossa piti käyttää grep-komentoa ja putkittaa cut-komento sen perään, mutta nyt komennossa on jotain vikaa. Eli eräästä serverin hakemistosta pitäisi tonkia tiedostoja, joisa esiintyy eräs merkkijono, olkoot se nyt esimerkkinä perinteinen "Matti Meikalainen".
Komento on seuraava:
grep -i "Matti Meikalainen" *|cut -f1 -d:|uniq
ja tuloksena seuraava virheilmoitus:
bash: /bin/grep: Argument list too long
En tajua mikä tuossa nyt on vikana, kun en ole paljoa noita komentoja käytellyt. Mikä siinä komennossa siis on liikaa?
Komento on seuraava:
grep -i "Matti Meikalainen" *|cut -f1 -d:|uniq
ja tuloksena seuraava virheilmoitus:
bash: /bin/grep: Argument list too long
En tajua mikä tuossa nyt on vikana, kun en ole paljoa noita komentoja käytellyt. Mikä siinä komennossa siis on liikaa?
Vastaukset 13
Vanhimmat
omituista ettei toimi. mulla nimittäin toimii tuo ihan ok.
tein pari tiedostoa jossa haettava teksti on ja ajoin sitten skriptin.
$ grep --version
GNU grep 2.5.3
grep (GNU grep) 2.5.1
Johtusko tuosta?
Mulla on sama grep versio ja ei anna virheilmoitusta. Ja toimii kummallakin tavalla mitä aikasemmin kirjotin.
Teeppä korjausasennus grepille.
En itse lähde asentelemaan. Pirautan adminille. Mikä tuon grepin voisi sitten rikkoa? Outoa..
Sain hommani eteenpäin Windowsin työkaluilla, kun tuo arkisto on servulla. Kopsasin sen arkistopaketin ja purin työpisteelle.
Lisää muutama välilyönti?
Ei näin:
grep -i "Matti Meikalainen" *|cut -f1 -d:|uniq
Vaan näin:
grep -i "Matti Meikalainen" * | cut -f1 -d: | uniq
Kiitos, mutta ei toiminut. Edelleen tuo sama virhe tulee.
Onkohan tämä RedHatti menny rikki, kun aiemmin kaiffarit ovat pystyneet käyttämään tuota hakukomentoa? Duunissa tätä tarvitaan silloin tällöin, kun joutuu jotain arkistoja kaivelemaan.
Käyttöoikeuksilla ei pitäisi varmaan olla merkitystä. Olen nyt superuserina ja yritän ajaa tuota komentoa, tuloksetta.
ls | xargs grep -i 'test' | cut -f2 -d: | uniq
>Onkohan tämä RedHatti menny rikki...
Ei ole vaan komennnon käyttökohde on muuttunut, Sana juttu niillä joilla komento nytkin toimii eli sitä ajetaan pienemmällö datamäärällä.
Grepin argumenttilista on muutamia tuhansia, en nyt muista ihan tarkkaan, mutta tämä on tiedossa oleva tilanne ja konstikin löytyy.
Googleta hakusanoilla find grep xargs niin löydät ohjeet.
Tuo komento toimii, mutta se palauttaa vain tuon haetun merkkijono. Pitäisi siis palauttaa ne tiedostot, joiden sisällössä on tuo haettu merkkijono.
>Pitäisi siis palauttaa ne tiedostot...
Et siis jaksanut lukea tuota seuraavaa ohjetta? ;)
Minä kun en ole ilkeä ihminen niin tein sen puolestasi ja löysin seuraavaa:
Versiosta 2.6.23 lähtien kernelistä on poistettu ARG_MAX-rajoitus niin että komentosi toimii sellaisenaan.
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=b6a2fea39318e43fee84fa7b0b90d68bed92d2ba
Siihen asti se pitää kiertää find/xargsilla eli menee jotenkin näin:
find . -type f -print0 | xargs -0 grep -i "Matti Meikalainen" |cut -f1 -d:|uniq
Ei kerkeä lukemaan kaikkea, varsinkaan jos dokumentissa jaaritellaan niitä näitä ja se haettava tieto on siellä jossain parin sivun takana ;)
No joo, jospa nyt kerkeisi paneutumaan paremmin kun tuo asia on jo hoidettu muilla tavoin. Kokeilen tuota antamaasi komentoa.
Kiitos kuitenkin! Hyvä että välillä törmää asiallisiin henkilöihin :)
Vaikuttais siltä että tiedostoja on todella paljon. Voit poistaa ongelman syöttämällä tiedostot esim. findilla.
find . -name "*" -exec