← Back to team overview

sslug-teknik team mailing list archive

Re: Et simplere og evt. mere effektivt script

 

Tirsdag 13 januar 2004 01:39 kvad Soren Munk:
> Hej folkens
> Sidder med et gammelt script som gør et udemærket job med at
> filtrere nogle ting ud af iptables-logfil
>
> grep "firewall " /var/log/firewall/iptables | sed 's/ MAC=[^ ]*//'
> | sed 's/ TOS=[^ ]*//' | sed 's/ PREC=[^ ]*//' | sed 's/ ID=[^
> ]*//' | sed 's/ TTL=[^ ]*//' | sed 's/ WINDOW=[^ ]*//' | sed 's/
> RES=[^ ]*//' | sed 's/ URGP=[^ ]*//' | sed 's/ munk kernel[^ ]*//'
> | sed 's/ firewall[^ ]*//'> /var/log/firewall/iptables-mod
>
> Kan det gøres nemmere ? Selvfølgelig kan det det, men hvordan ?
> Kan man evt. slå alle sed kaldene sammen til et?

God dag Søren,

uden at have testet det vil jeg tro at noget lignende følgende kan 
gøre det:

sed '/firewall /!d;s/ \(MAC=\|TOS=\|PREC=\|ID=\|TTL=\|WINDOW=\|RES=\|
URGP=\|munk kernel\|firewall\)[^ ]*//' /var/log/firewall/iptables > /
var/log/firewall/iptables-mod

Som du kan se behøver du ikke grep.
Ovenstående gennemløber /var/log/firewall/iptables linje for linje.
Hvis linjen indeholder strengen "firewall " bliver den _ikke_ (!) 
slettet (d). Helt ligesom dit originale eksempel hvor du med grep kun 
udtrækker linjer der indeholder strengen.
Semikolonet angiver en ny sed-kommando at udføre på linjen.
Derefter bruges seds ELLER-operator - \| - til at liste alle de ord 
der alternativt kan indgå i det mønster du ønsker at erstatte. 
Samlingen af alternative ord er samlet inden for et par paranteser - 
\( og \) - for at skelne dem fra ikke-alternative mønstre som de skal 
optræde sammen med - her " " foran alternativerne og "[^ ]*" efter 
alternativerne.

Hvis du vil bibeholde alle linjer, og blot ændre i de som indeholder 
strengen "firewall " kan du pakke det en smule mere sammen således:

sed '/firewall /s/ \(MAC=\|TOS=\|PREC=\|ID=\|TTL=\|WINDOW=\|RES=\|
URGP=\|munk kernel\|firewall\)[^ ]*//' /var/log/firewall/iptables > /
var/log/firewall/iptables-mod

Her er blot fjernet "!d;" så alle linjer der indeholder strengen 
"firewall " behandles og alle der ikke indeholder strengen lades 
ubehandlede men iøvrigt ryger med i udfilen.

Hilsen Johnny :o)



Follow ups

References