Yritän seurata eräästä isosta logista tiettyjä virheilmoituksia tyyliin
tail -f /var/log/logname|grep "error".
Mutta joukossa on turhia virheitä, jotka olen yrittänyt erottaa joukosta antamalla grepin palauttaa vain rivit, joissa kyseistä stringiä ei esiinny
tail -f /var/log/logname|grep "error"|grep -v "mail"
Mutta mutta. Grep ottaa jostain nokkiinsa eikä tulosta mitään. Syntaksi on oikein, sillä jos testaan putkitusta korvaamalla tail -f esim tail -100, halutut rivit löytyvät. Miksi grep hylkiin "tail -f"-komentoa ja miten ongelman yksinkertaisesti voisi kiertää. Vai pitääkö siirtyä perliin...
tail -f /var/log/logname|grep "error".
Mutta joukossa on turhia virheitä, jotka olen yrittänyt erottaa joukosta antamalla grepin palauttaa vain rivit, joissa kyseistä stringiä ei esiinny
tail -f /var/log/logname|grep "error"|grep -v "mail"
Mutta mutta. Grep ottaa jostain nokkiinsa eikä tulosta mitään. Syntaksi on oikein, sillä jos testaan putkitusta korvaamalla tail -f esim tail -100, halutut rivit löytyvät. Miksi grep hylkiin "tail -f"-komentoa ja miten ongelman yksinkertaisesti voisi kiertää. Vai pitääkö siirtyä perliin...
Vastaukset 7
Vanhimmat
Kannattaa tutustua käsitteeseen reqular expression, suomeksi säännöllinen lauseke. Grep:lle voidaan määritellä regexp -lausekkeita joilla voi määritellä hakuehtoja. Eli sä voit yhdistää tehgdä hakuehdon, joka palauttaa esim. rivit joilla on sana "error", mutta ei sanaa "mail"
Tässä on nyt eka ohje mikä googlella osu kohdalle.
http://pegasus.rutgers.edu/~elflord/unix/grep.html
...regexejä, mutta silti ei ole selvää, miten väännetään regex, jos
- mukaan halutaan rivi, jolla jokin sanoista "jees1", "jees2", "jees3"
- mutta rivillä ei saa olla yksikään sanoista "ei1", "ei2" tai "ei3"
- sanojen sijaintia rivillä ei tiedetä ja
- sanat voivat olla missä järjestyksessä tahansa
Here's one for you...
Joo tarkemmin ajatellen toi tais olla niitä juttuja, mikä oli aika hankala ellei ainakin lähes mahdoton.
Toi ehto: A mutta ei B on ongelmallinen.
No ainakin se onnistuu helposti käyttämällä sed:ä
tail -f /var/log/messages | sed -n -e '/mail/d' -e'/error/p'
Niin ja huomaa tuo parametrien järjestys. Ne pitää olla noin. Eli ensin poistetaan ei-halutut rivit, joilla on sana mail, sitten tulostetaan halutut rivit, joilla on sana error.
Toden rotta. Sediä en ole koskaan käyttänyt ja noinhan se onnistuukin. Kiitos!
Kannattaa tutustua käsitteeseen reqular expression, suomeksi säännöllinen lauseke. Grep:lle voidaan kirjottaa regexp -lausekkeita joilla voi määritellä hakuehtoja. Eli sä voit tehdä hakuehdon, joka palauttaa esim. vain rivit joilla on sana "error", mutta ei sanaa "mail"
Tässä on nyt eka ohje, mikä googlella osu kohdalle.
http://pegasus.rutgers.edu/~elflord/unix/grep.html
regular expression, ei reqular
Olipas taas vaikeeta :)