[sed] Verwijderen van regels uit een bestand

Pagina: 1
Acties:
  • 382 views sinds 30-01-2008
  • Reageer

  • DSmarty
  • Registratie: Februari 2000
  • Niet online
Heren, dames :)

Ik zit met de volgende uitdaging:

Ik draai een shellscript die een regel toevoegt aan een bepaald bestand, dit ziet er uit als:
2.2.2.2,off,DROP,on

Een tijd later draait weer een shellscript die dit ongedaan moet maken, kortom, de regel 2.2.2.2,off,DROP,on moet weer verwijderd worden uit dat bestand.

Na wat searches heb ik iig het idee dat de beste oplossing SED is.
Echter, ik kan niet vinden hoe ik een lijn verwijder.
Vervangen wel, bijv met sed s/watikwilverwijderen/vervangendoordit/ /bestand > /bestand

In mijn geval dus: sed s/2.2.2.2// /bestand > /bestand

De tekst zelf wordt dan wel verwijderd, maar de output wordt dan:
code:
1
2
3
4
4.4.4.4,off,DROP,on
3.3.3.3,off,DROP,on

1.1.1.1,off,DROP,on


En dat gaat helaas niet werken, er mogen geen lege regels in voorkomen.

Kortom: Hoe kan ik met sed opgeven dat het als het een regel vindt dat voldoet aan een pattern (bijv 2.2.2.2) de gehele regel verwijderd :? (en het resultaat gesaved)
Kon het in de documentatie van sed niet vinden.

[ Voor 3% gewijzigd door DSmarty op 31-03-2004 11:38 ]


  • _JGC_
  • Registratie: Juli 2000
  • Nu online
Hmm, jij vraagt naar een grep -v met sed ;)

Altijd maar dat sed, maar je kunt een delete ook gewoon met grep -v doen ;)

  • DSmarty
  • Registratie: Februari 2000
  • Niet online
Lol :)

Ik denk dat ik het trouwens gevonden heb, ik had nog een topic uit 2001 >:) over het hoofd gezien:
code:
1
cat /test |sed  s/test//|sed "/^$/d" > /test

  • Seth4Chaos
  • Registratie: Maart 2001
  • Niet online

Seth4Chaos

that's me...

inplaats van een S(ubsitute) kan je dan beter een D(elete) doen.

ik weet niet precies meer (uit me hoofd) hoe dat moet maar weet dat je ipv die 's' een 'd' moet gebruiken

edit: je hebt het zelf al gevonden...maar wel die 'd' he :)

als kan je dat ook in 1 regel doen hoor:
code:
1
cat /test |sed  /test/d > /test

[ Voor 59% gewijzigd door Seth4Chaos op 31-03-2004 12:00 ]

Mistakes are proof that you are trying...


  • DSmarty
  • Registratie: Februari 2000
  • Niet online
Alleen werkt het nog niet helemaal goed.

Het bestand dat bewerkt wordt ziet er uit als dit:
code:
1
1.1.1.1,off,DROP,on


Het script wordt aangeroepen als volgt:
code:
1
scriptje 1.1.1.1


En deze moet dus de gehele regel 1.1.1.1,off,DROP,on uit bestand verwijderen.

Het script ziet er nu zo uit:
code:
1
2
3
#!/bin/sh
ip=$1
cat /var/smoothwall/ipblock/config |sed  /$ip/d > /var/smootwhall/ipblock/config


Met bovenstaande veranderd er niets aan het bestand, de entry blijft keurig staan.

Daar zal ergens een fout in zitten, moet wel toegeven dat ik bijzonder weinig ervaring heb met linux-shellscripts.

[ Voor 129% gewijzigd door DSmarty op 31-03-2004 12:14 ]


  • 0siris
  • Registratie: Augustus 2000
  • Laatst online: 07-02 23:33
kun je niet zoiets gebruiken?
code:
1
sed -e"s/$1\,off\,DROP\,on"/""/ sourcefile

en dan bovenstaande aanroepen met scriptje 1,1,1,1?
mijn probleem: ik vind shellscripten leuk, maar ik bak er weinig van ;)

[ Voor 60% gewijzigd door 0siris op 31-03-2004 12:19 . Reden: post hieronder van TS ]

ach...in een volgend leven lach je er om!


  • DSmarty
  • Registratie: Februari 2000
  • Niet online
die 1.1.1.1 is geen vaste waarde.
Het shellscript wordt aangeroepen als: scriptje x.x.x.x (een IP adres).
En vervolgens dient de regel x.x.x.x,blabla,blabla,blabla uit een bestand verwijderd te worden.

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Ouch.. je kan niet met sed terugpipen naar de input file :) Je raakt je input file dan kwijt.. dus eerst pipen naar een tijdelijk bestand een dan de input file overschrijven :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • 0siris
  • Registratie: Augustus 2000
  • Laatst online: 07-02 23:33
dan zul je met grep -v aan de slag moeten ( = haal alles eruit BEHALVE...)

ach...in een volgend leven lach je er om!


  • DSmarty
  • Registratie: Februari 2000
  • Niet online
Toch maar met grep :)

code:
1
2
3
#!/bin/sh
ip=$1
cat /var/smoothwall/ipblock/config |grep -v $1 > /var/smoothwall/ipblock/config


Getest en werkt perfect, dank U voor de hulp collegae.

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
code:
1
2
3
#!/bin/sh
IP=$1
ex -c "%g/$IP/d" -c 'wq!' /var/smoothwall/ipblock/config
werkt ook, niet echt netjes, maar heeft als voordeel dat je niet je file kwijtraakt als het bestand heel groot is, je opent namelijk bij deze regel hetzelfde bestand weer om te schrijven met de >, als je pech hebt doet hij dat voordat je het hele bestand gelezen hebt, en ben je informatie kwijt :), nou weet ik niet meer precies onder welke omstandigheden dat nou wel/niet gebeurt, maar het gebeurt vaak genoeg voor mij om het zekere voor het onzekere te nemen :)
Dit kun je oplossen door het eerst naar een tijdelijk bestand te greppen, en dan verplaatsen, of een programma gebruiken dat maar 1 bestand nodig heeft.

[ Voor 15% gewijzigd door blaataaps op 31-03-2004 12:28 ]


  • 0siris
  • Registratie: Augustus 2000
  • Laatst online: 07-02 23:33
DSmarty schreef op 31 maart 2004 @ 12:22:
code:
1
2
3
#!/bin/sh
ip=$1
cat /var/smoothwall/ipblock/config |grep -v $1 > /var/smoothwall/ipblock/config
Wat doet regel 2? ;)

[code]
#!/bin/sh
smoothfile=/var/smoothwall/ipblock/config
grep -v $1 $smoothfile > $smoothfile
[/code]
volgens mij moet dit ook werken

[ Voor 27% gewijzigd door 0siris op 31-03-2004 12:39 ]

ach...in een volgend leven lach je er om!


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

blaataaps schreef op 31 maart 2004 @ 12:25:
code:
1
2
3
#!/bin/sh
IP=$1
ex -c "%g/$IP/d" -c 'wq!' /var/smoothwall/ipblock/config
werkt ook, niet echt netjes, maar heeft als voordeel dat je niet je file kwijtraakt als het bestand heel groot is, je opent namelijk bij deze regel hetzelfde bestand weer om te schrijven met de >, als je pech hebt doet hij dat voordat je het hele bestand gelezen hebt, en ben je informatie kwijt :), nou weet ik niet meer precies onder welke omstandigheden dat nou wel/niet gebeurt, maar het gebeurt vaak genoeg voor mij om het zekere voor het onzekere te nemen :)
Dit kun je oplossen door het eerst naar een tijdelijk bestand te greppen, en dan verplaatsen, of een programma gebruiken dat maar 1 bestand nodig heeft.
Het lijkt erop dat dit te maken heeft met de blocksize van je Filesystem; in ieder geval werd mijn in/output file uiteindelijk exact 8192 bytes groot :)\

edit:
0siris schreef op 31 maart 2004 @ 12:34:
[...]

Wat doet regel 2? ;)

[code]
#!/bin/sh
smoothfile=/var/smoothwall/ipblock/config
grep -v $1 $smoothfile > $smoothfile
[/code]
volgens mij moet dit ook werken
nogmaals; pipe NIET terug naar je inputfile!

[ Voor 17% gewijzigd door Spider.007 op 31-03-2004 12:48 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 07-02 09:48

TrailBlazer

Karnemelk FTW

Wat gebeurt er als je het newline character toevoegt aan je regex.

[In mijn geval dus: sed s/2.2.2.2 \n // /bestand > /bestand

De tekst zelf wordt dan wel verwijderd, maar de output wordt dan:

[ Voor 32% gewijzigd door TrailBlazer op 31-03-2004 12:50 ]


  • DSmarty
  • Registratie: Februari 2000
  • Niet online
Het werkt nu als een zonnetje bij mij :)

Ik vroeg dit trouwens nav: http://community.smoothwa...ewtopic.php?p=31601#31601

Betreft een guardian MOD voor Smoothwall Express 2.0 (fixes2)

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 07-02 09:48

TrailBlazer

Karnemelk FTW

DSmarty schreef op 31 maart 2004 @ 13:57:
Het werkt nu als een zonnetje bij mij :)

Ik vroeg dit trouwens nav: http://community.smoothwa...ewtopic.php?p=31601#31601

Betreft een guardian MOD voor Smoothwall Express 2.0 (fixes2)
maare hoe doe je het nou :?

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
TrailBlazer schreef op 31 maart 2004 @ 14:23:
[...]

maare hoe doe je het nou :?
Misschien even op de link klikken die je net quote? Daar heeft ie het volgens mij gepost, volgens mij doet ie het op een manier die niet meer werkt als het bestand groter wordt of als je pech hebt :)

  • Zwerver
  • Registratie: Februari 2001
  • Niet online
blaataaps schreef op 31 maart 2004 @ 14:31:
[...]

Misschien even op de link klikken die je net quote? Daar heeft ie het volgens mij gepost, volgens mij doet ie het op een manier die niet meer werkt als het bestand groter wordt of als je pech hebt :)
Ach, peter is eigenwijs :P

Woonachtig Down Under. Ik negeer je insults niet, maar tegen de tijd dat ik ze lees zijn ze meestal niet relevant meer


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

blaataaps schreef op 31 maart 2004 @ 14:31:
[...]

Misschien even op de link klikken die je net quote? Daar heeft ie het volgens mij gepost, volgens mij doet ie het op een manier die niet meer werkt als het bestand groter wordt of als je pech hebt :)
Inderdaad; net als ik mij verschrikkelijk kan irriteren aan het oneigenlijke gebruik van cat :( in de manpage staat toch duidelijk
code:
1
grep [options] PATTERN [FILE...]
Waarom moet moet er dan ook nog eens een cat voor?

:P

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • DSmarty
  • Registratie: Februari 2000
  • Niet online
Hehe, ik had er even overheen gelezen, maar ben ook eigenwijs :)

Bestand zal hooguit paar honderd byte zijn.
Maar ik zal het wel even fatsoeneren :)

offtopic:
Oneigenlijk gebruik van cat is het niet echt, als je al jaren met aix / hpux bakken op een bepaalde manier werkt slijten bepaalde gewoonten gewoon in, ook al worden veel zaken uitgebreid met nieuwe features etc. etc.

[ Voor 7% gewijzigd door DSmarty op 31-03-2004 15:18 ]


  • DSmarty
  • Registratie: Februari 2000
  • Niet online
code:
1
2
3
4
#!/bin/sh
ip=$1
grep -v $1 /var/smoothwall/ipblock/config > /var/smoothwall/ipblock/config
/usr/local/bin/setipblock


Ietwat gefatsoeneerd :)

  • Seth4Chaos
  • Registratie: Maart 2001
  • Niet online

Seth4Chaos

that's me...

DSmarty schreef op 31 maart 2004 @ 15:24:
code:
1
2
3
4
#!/bin/sh
ip=$1
grep -v $1 /var/smoothwall/ipblock/config > /var/smoothwall/ipblock/config
/usr/local/bin/setipblock


Ietwat gefatsoeneerd :)
0siris schreef op 31 maart 2004 @ 12:34:
[...]

Wat doet regel 2? ;)
de vraag wat die regel 2 doet blijft staan hoor ;)

[ Voor 16% gewijzigd door Seth4Chaos op 31-03-2004 15:28 ]

Mistakes are proof that you are trying...


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Ik blijf erbij dat het netter is om het als volgt te doen:
code:
1
2
3
4
5
#!/bin/sh
ip=$1
grep -v $1 /var/smoothwall/ipblock/config > /var/smoothwall/ipblock/config.tmp
mv /var/smoothwall/ipblock/config.tmp /var/smoothwall/ipblock/config
/usr/local/bin/setipblock
Dit voorkomt problemen wanneer je config file > een paar Kb wordt :)
En inderdaad is het oneigenlijke gebruik van cat vaak niet zo heel erg; maar zorgt vaak wel voor een bepaald denkpatroon met bijbehorende performance problemen; zie bijvoorbeeld [rml][ shell script] expressie wil niet[/rml], waar het niet gebruiken van cat een snelheidswinst van een paar miljoen procent opleverd :)
edit:
Seth4Chaos schreef op 31 maart 2004 @ 15:27:

[...]

de vraag wat die regel 2 doet blijft staan hoor ;)
De 2e regels slaat het 1e argument van het script op in de variabele ip; die even verderop wordt aangeroepen met $ip :)

[ Voor 19% gewijzigd door Spider.007 op 31-03-2004 15:30 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Zodra je met tmp-files gaat werken is mijn oplossing met ex mooier en korter vind ik (en bij grotere files heb je niet opeens 2x zoveel diskspace nodig, vooral ook een pluspunt geweest hier af en toe) :)

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

blaataaps schreef op 31 maart 2004 @ 15:41:
Zodra je met tmp-files gaat werken is mijn oplossing met ex mooier en korter vind ik (en bij grotere files heb je niet opeens 2x zoveel diskspace nodig, vooral ook een pluspunt geweest hier af en toe) :)
Dat is waar; het probleem is dat je naast een extra afhankelijkheid ook een extra moeilijkheid creerd voor toekomstige aanpassingen :) Ik neem aan dat ex voor eventuele grote bestanden, om een aanpassing te kunnen doen, toch het geheugen hiervoor aan zal moeten spreken?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • 0siris
  • Registratie: Augustus 2000
  • Laatst online: 07-02 23:33
Spider.007 schreef op 31 maart 2004 @ 15:29:
...zie bijvoorbeeld [rml][ shell script] expressie wil niet[/rml], waar het niet gebruiken van cat een snelheidswinst van een paar miljoen procent opleverd :)
:) inderdaad. Ook blijkt in AIX 5.2 grep 3x zo langzaam als de GNU versie hiervan!

ach...in een volgend leven lach je er om!


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 20-02 12:27
Spider.007 schreef op 31 maart 2004 @ 15:29:
Ik blijf erbij dat het netter is om het als volgt te doen:
code:
1
2
3
4
5
#!/bin/sh
ip=$1
grep -v $1 /var/smoothwall/ipblock/config > /var/smoothwall/ipblock/config.tmp
mv /var/smoothwall/ipblock/config.tmp /var/smoothwall/ipblock/config
/usr/local/bin/setipblock
Dit voorkomt problemen wanneer je config file > een paar Kb wordt :)
En inderdaad is het oneigenlijke gebruik van cat vaak niet zo heel erg; maar zorgt vaak wel voor een bepaald denkpatroon met bijbehorende performance problemen; zie bijvoorbeeld [rml][ shell script] expressie wil niet[/rml], waar het niet gebruiken van cat een snelheidswinst van een paar miljoen procent opleverd :)
edit:


[...]


De 2e regels slaat het 1e argument van het script op in de variabele ip; die even verderop wordt aangeroepen met $ip :) Waar dan? :P
Nu ben ik niet een onwijze shell scripter ofzo, maar je had het over performance he? Dan is dit toch sneller?

code:
1
2
3
4
#!/bin/sh
grep -v $1 /var/smoothwall/ipblock/config > /var/smoothwall/ipblock/config.tmp
mv /var/smoothwall/ipblock/config.tmp /var/smoothwall/ipblock/config
/usr/local/bin/setipblock

[/code]

Volgens mij was je dit ook van plan :p

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

pierre-oord schreef op 31 maart 2004 @ 18:27:
[...]


Nu ben ik niet een onwijze shell scripter ofzo, maar je had het over performance he? Dan is dit toch sneller?

code:
1
2
3
4
#!/bin/sh
grep -v $1 /var/smoothwall/ipblock/config > /var/smoothwall/ipblock/config.tmp
mv /var/smoothwall/ipblock/config.tmp /var/smoothwall/ipblock/config
/usr/local/bin/setipblock


Volgens mij was je dit ook van plan :p
Ik heb het even gemeten hoelang dat commando zou kosten; en daar rolt automatisch je snelheidwinst uit:

code:
1
2
3
4
5
$ time ip='255.255.255.225'

real    0m0.000s
user    0m0.000s
sys     0m0.000s
;)

Het is wel zo netjes om alle variabelen boven aan je script te declareren zodat je niet moeilijk hoeft te doen mochten deze vervangen worden :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate

Pagina: 1