[shell script] variabele in reguliere expressie

Pagina: 1
Acties:

  • Arnout
  • Registratie: December 2000
  • Laatst online: 10-02 17:38
Ik ben bezig een klein bash scriptje te schrijven. Doel is dat ik een mailtje krijg wanneer er berichten door onze applicatie gaan (messages != 0).

Dit lukt aardig, maar nu wil ik het scriptje d.m.v. cron laten draaien, ieder uur. Het script moet dus de log doorwerken en alleen kijken naar het voorgaande uur.

Hoe krijg ik nu die variabele (die het uur bevat waarop gezocht moet worden) in de reguliere expressie die grep gebruikt? Ik gebruik al double quotes maar als ik de variabele erin plaats werkt het niet, ook niet als ik het escape. Ik heb het gevoel dat de nesting van double quotes (grep expressie), back quotes (date in de expressie) en dan ook nog single quotes (argument voor date) niet wil meewerken om de shell variabele te parsen.

Alvast bedankt. :)

script:
code:
1
2
3
4
5
6
7
8
9
10
#!/bin/sh

huidig_uur=`date '+%l'`
vorig_uur=`expr $huidig_uur - 1`
cat domain/RAM-IA/RAM-IAServer/logs/weblogic.log | grep "`date '+%b%e, %Y$vorig_uur:[0-9][0-9]:[0-9][0-9] %p'`.*messages=[1-9][0-9]*" > activity.log
if [ -s activity.log ]
then
        mail -s "RIF activiteit" user@domain.nl < activity.log
fi
rm activity.log

[ Voor 3% gewijzigd door Arnout op 06-04-2005 15:55 ]


Verwijderd

code:
1
2
huidig_uur=`date '+%l'`
vorig_uur=`echo $huidig_uur - 1 | bc`


zou ook moeten werken...

  • irondog
  • Registratie: Januari 2001
  • Laatst online: 11-05-2025

irondog

alle dingen moeten onzin zijn

code:
1
2
var="de string"
echo 'De geinterpreteerde vorm van $var krijg je alleen als je '$var' concateneert'


Dubbele quotes werkt minder letterlijk, maar dan struikelt het commando date over het feit dat er spaties in het commando zitten. Concateneren dus!

[P5B deluxe] [Core2Duo 6300] [2 X 1GB DDR2] [GF FX7300] [320 GB WD] [Gentoo] [VISTA]


  • Arnout
  • Registratie: December 2000
  • Laatst online: 10-02 17:38
irondog schreef op woensdag 06 april 2005 @ 16:24:
<snip>

Dubbele quotes werkt minder letterlijk, maar dan struikelt het commando date over het feit dat er spaties in het commando zitten. Concateneren dus!
Dank :)
Het werkt.

Nog even wat extra info over quoting in unix gelezen: http://www.grymoire.com/Unix/Quote.html

scriptje ziet er nu zo uit:
code:
1
2
3
4
5
6
7
8
9
10
#!/bin/sh

huidig_uur=`date '+%l'`
vorig_uur=`expr $huidig_uur - 1`
cat domain/RAM-IA/RAM-IAServer/logs/weblogic.log | grep "`date '+%b%e, %Y '$vorig_uur':[0-9][0-9]:[0-9][0-9] %p'`.*messages=[1-9][0-9]*" > activity.log 
if [ -s activity.log ]
then
        mail -s "RIF activiteit" user@domain.nl < activity.log
fi
rm activity.log

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 12:22

Kees

Serveradmin / BOFH / DoC
en altijd variablen aanroepen met: ${vorig_uur} als er geen spaties omheen staan

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Verwijderd

ps, je gaat er vanuit dat /bin/sh gelinkt is naar /bin/bash? is niet op elk systeem zo...

  • Arnout
  • Registratie: December 2000
  • Laatst online: 10-02 17:38
Verwijderd schreef op donderdag 07 april 2005 @ 17:42:
ps, je gaat er vanuit dat /bin/sh gelinkt is naar /bin/bash? is niet op elk systeem zo...
klopt, je hebt gelijk.

code:
1
2
3
4
5
$ uname -s -v -r
AIX 2 5

$ whereis sh
sh: /usr/bin/sh

  • spil
  • Registratie: September 2000
  • Laatst online: 06-09-2025
Op AIX behoort ksh tot de standaard uitrusting. shabang #!/usr/bin/ksh
Wellicht dat het aan mijn scripts ligt, :) maar de meeste draaien zonder aanpassing zowel op bash als ksh.

Dan zijn Arithmetic Expressions beschikbaar via $(()) waardoor je berekening door ksh laat uitvoeren en hoef je niet te forken naar een bc of expr proces met `` (of $() ). Het lijkt een triviaal verschil, maar in grote scripts kan het vervangen van forks door internals een factor 10 aan tijd schelen. Zo kun je grep ook de filename meegeven inplaats van de file met cat door grep te pipen.
code:
1
2
3
#!/usr/bin/ksh
vorig_uur = $((`date +%l` - 1))
grep "`date '+%b%e, %Y${vorig_uur}:[0-9][0-9]:[0-9][0-9] %p'`.*messages=[1-9][0-9]*" domain/RAM-IA/RAM-IAServer/logs/weblogic.log > activity.log

PS. Een van de interessantere internals vind ikzelf parameter substitutions met patterns als o.a. ${name#pattern}, daarmee kun je je o.a. forks naar basename besparen
code:
1
2
3
4
5
6
7
fileName=/var/adm/syslog.user
forked=`basename ${fileName}` # fork!
noFork=${fileName##*/} # No fork, same result!
echo ${forked} == ${noFork}
forked=`dirname ${fileName}` # fork!
noFork=${fileName%/*} # No fork!
echo ${forked} == ${noFork}

Homeserver specs: Dell Latitude D400 / 1GB mem / 160GB Seagate 5400.3 2.5" / 3Com 3c575 Cardbus NIC / Atheros AR5413 hostapd WLAN / FreeBSD 7.2

Pagina: 1