Zoeken op website

15 Sed Command Tips voor Linux systeembeheertaken


Elke systeembeheerder heeft dagelijks te maken met platte tekstbestanden. Weten hoe u bepaalde secties moet bekijken, hoe u woorden kunt vervangen en hoe u de inhoud uit die bestanden kunt filteren, zijn vaardigheden die u bij de hand moet hebben zonder dat u op Google hoeft te zoeken.

In dit artikel bespreken we sed, de bekende stream-editor, en delen we 15 tips om deze te gebruiken om de eerder genoemde doelen te bereiken, en meer.

Wat is Sed-commando?

De opdracht 'sed', een afkorting voor stream-editor, is een veelzijdige en krachtige tool voor tekstmanipulatie die werkt op tekststromen, waardoor gebruikers verschillende bewerkingen op gegevens kunnen uitvoeren, zoals zoeken, vervangen, invoegen en verwijderen. ‘Sed’ gebruikt reguliere expressies om patronen voor tekstmanipulatie te definiëren, en kan worden gebruikt voor batchbewerkingstaken en tekstverwerking in scripts.

Een van de opvallende kenmerken is in-place bewerking, waarbij het bestanden rechtstreeks kan wijzigen of back-ups kan maken terwijl het wijzigingen aanbrengt. ‘Sed’ is een essentieel hulpmiddel voor systeembeheerders, programmeurs en iedereen die zich bezighoudt met teksttransformatie en gegevensmanipulatietaken op de opdrachtregel.

Hieronder volgen enkele veelvoorkomende ‘sed’-opdrachten met voorbeelden:

1. Een reeks regels van een bestand bekijken

Met tools zoals kop en staart kunnen we de onderkant of de bovenkant van een bestand bekijken. Wat als we een gedeelte in het midden moeten bekijken? De volgende sed-oneliner retourneert de regels 5 tot en met 10 uit tecmint.txt:

sed -n '5,10p' tecmint.txt

2. Het volledige bestand bekijken behalve een bepaald bereik

Aan de andere kant is het mogelijk dat u het hele bestand wilt afdrukken, behalve een bepaald bereik. Om de regels 20 tot en met 35 uit te sluiten van tecmint.txt, doe je het volgende:

sed '20,35d' myfile.txt

3. Niet-opeenvolgende lijnen en bereiken bekijken

Het is mogelijk dat u geïnteresseerd bent in een reeks niet-opeenvolgende lijnen, of in meer dan één bereik. Laten we de regels 5-7 en 10-13 uit tecmint.txt weergeven:

sed -n -e '5,7p' -e '10,13p' tecmint.txt

Zoals u kunt zien, stelt de optie -e ons in staat een bepaalde actie uit te voeren (in dit geval regels afdrukken) voor elk bereik.

4. Woorden of tekenreeksen in een bestand vervangen

Om elke instantie van het woord version te vervangen door story in tecmint.txt, doe je het volgende:

sed 's/version/story/g' tecmint.txt

Daarnaast kun je overwegen om gi te gebruiken in plaats van g om hoofdletters en kleine letters te negeren:

sed 's/version/story/gi' myfile.txt

Om meerdere lege spaties te vervangen door een enkele spatie, gebruiken we de uitvoer van het commando ip route show met een pijplijn:

ip route show | sed 's/  */ /g'

Vergelijk de uitvoer van ip route show met en zonder de pijplijn:

5. Woorden of tekenreeksen binnen een bereik vervangen

Als u alleen woorden binnen een regelbereik wilt vervangen (bijvoorbeeld 30 tot en met 40), kunt u het volgende doen:

sed '30,40 s/version/story/g' tecmint.txt

Uiteraard kunt u in plaats van een bereik ook een enkele lijn aangeven via het overeenkomstige nummer.

6. Verwijder opmerkingen uit een bestand

Soms worden configuratiebestanden geladen met commentaar. Hoewel dit zeker nuttig is, kan het nuttig zijn om soms alleen de configuratie-instructies weer te geven als u ze allemaal in één oogopslag wilt zien.

Om lege regels of regels die beginnen met # uit het Apache-configuratiebestand te verwijderen, doet u het volgende:

sed '/^#\|^$\| *#/d' httpd.conf

Het dakje wordt gevolgd door het hekje (^#) dat het begin van een regel aangeeft, terwijl ^$ lege regels vertegenwoordigt. De verticale balken geven Booleaanse bewerkingen aan, terwijl de achterwaartse schuine streep wordt gebruikt om aan de verticale balken te ontsnappen.

In dit specifieke geval bevat het Apache-configuratiebestand regels met #’s die niet aan het begin van sommige regels staan, dus wordt *# ook gebruikt om deze te verwijderen.

7. Vervang een hoofdletterongevoelig woord in een bestand

Om een woord dat begint met hoofdletters of kleine letters te vervangen door een ander woord, kunnen we ook sed gebruiken. Laten we ter illustratie het woord zip of Zip vervangen door rar in tecmint.txt:

sed 's/[Zz]ip/rar/g' tecmint.txt

8. Specifieke gebeurtenissen zoeken in een logbestand

Een ander gebruik van sed bestaat uit het afdrukken van de regels uit een bestand die overeenkomen met een bepaalde reguliere expressie. We zijn bijvoorbeeld wellicht geïnteresseerd in de autorisatie- en authenticatie-activiteiten die plaatsvonden op 2 juli, volgens de /var /log/secure log in op een CentOS-server.

In dit geval is het patroon waarnaar moet worden gezocht 2 juli aan het begin van elke regel:

sed -n '/^Jul  1/ p' /var/log/secure

9. Spaties of lege regels in een bestand invoegen

Met sed kunnen we ook spaties (lege regels) invoegen voor elke niet-lege regel in een bestand. Om één lege regel om de andere regel in te voegen in LICENSE, een tekstbestand zonder opmaak, doet u het volgende:

sed G tecmint.txt

Om twee lege regels in te voegen, doet u het volgende:

sed 'G;G' tecmint.txt

Voeg een hoofdletter G toe, gescheiden door een puntkomma, als u meer lege regels wilt toevoegen. De volgende afbeelding illustreert het voorbeeld dat in deze tip wordt beschreven:

Deze tip kan van pas komen als u een groot configuratiebestand wilt inspecteren. Het invoegen van een spatie om de andere regel en het doorsturen van de uitvoer naar minder zal resulteren in een vriendelijkere leeservaring.

10. ^M uit een bestand verwijderen

Het dos2unix programma converteert platte tekstbestanden van Windows/Mac-opmaak naar Unix/Linux, waarbij verborgen nieuweregeltekens worden verwijderd die zijn ingevoegd door sommige teksteditors die op die platforms worden gebruikt. Als het niet op uw Linux-systeem is geïnstalleerd, kunt u de functionaliteit ervan nabootsen met sed in plaats van het te installeren.

In de afbeelding aan de linkerkant kunnen we verschillende DOS-tekens voor nieuwe regels (^M) zien, die later werden verwijderd met:

sed -i 's/\r//' myfile.txt

Houd er rekening mee dat de optie -i in-place bewerking aangeeft. Wijzigingen worden dan niet teruggestuurd naar het scherm, maar worden opgeslagen in het bestand.

Opmerking: u kunt DOS-tekens voor nieuwe regels invoegen tijdens het bewerken van een bestand in de Vim-editor met Ctrl+V en Ctrl+M.

11. Maak een back-upbestand met Sed Command

In de vorige tip hebben we sed gebruikt om een bestand te wijzigen, maar hebben we het originele bestand niet opgeslagen. Soms is het een goed idee om voor de zekerheid een reservekopie van het originele bestand op te slaan.

Om dat te doen, geeft u na de optie -i een achtervoegsel aan (tussen enkele aanhalingstekens) dat moet worden gebruikt om de naam van het originele bestand te wijzigen.

In het volgende voorbeeld zullen we alle exemplaren van dit of Dit (hoofdlettergebruik negeren) vervangen door die in mijnbestand.txt, en we zullen dit opslaan het originele bestand als mijnbestand.txt.orig.

Ten slotte zullen we het diff-hulpprogramma gebruiken om de verschillen tussen beide bestanden te identificeren:

sed -i'.orig' 's/this/that/gi' myfile.txt

12. Woordenparen in een bestand wisselen

Stel dat u een bestand heeft met volledige namen in de indeling Voornaam, Achternaam. Om het bestand goed te kunnen verwerken, kunt u Achternaam en Voornaam omwisselen.

We kunnen dat vrij eenvoudig doen met sed:

sed 's/^\(.*\),\(.*\)$/\, /g' names.txt

In de afbeelding hierboven kunnen we zien dat haakjes, omdat dit speciale tekens zijn, moeten worden geëscaped, net als de cijfers 1 en 2.

Deze cijfers vertegenwoordigen de gemarkeerde reguliere expressies (die tussen haakjes moeten verschijnen):

  • 1 vertegenwoordigt het begin van elke regel tot aan de komma.
  • 2 is een tijdelijke aanduiding voor alles wat rechts van de komma aan het einde van de regel staat.

De gewenste uitvoer wordt aangegeven in het formaat SecondColumn (Achternaam) + komma + spatie + FirstColumn (Voornaam). Voel je vrij om het te veranderen naar wat je maar wilt.

13. Woorden alleen vervangen als er een afzonderlijke overeenkomst is gevonden

Soms is het vervangen van alle exemplaren van een bepaald woord, of een willekeurig aantal, niet precies wat we nodig hebben. Misschien moeten we de vervanging uitvoeren als er een afzonderlijke match wordt gevonden.

Het kan bijvoorbeeld zijn dat we start alleen willen vervangen door stop als het woord services in dezelfde regel voorkomt. In dat scenario zal het volgende gebeuren:

We need to start partying at work,
but let’s remember to start all services first.

In de eerste regel wordt start niet vervangen door stop, omdat het woord services in die regel niet voorkomt, in tegenstelling tot de tweede regel.

sed '/services/ s/start/stop/g' msg.txt

14. Twee of meer vervangingen tegelijk uitvoeren

Je kunt twee of meer vervangingen combineren in één enkele sed-opdracht. Laten we de woorden that en regel in mijnbestand.txt vervangen door respectievelijk Dit en vers.

Merk op hoe dit kan worden gedaan door een gewoon sed vervangingscommando te gebruiken, gevolgd door een puntkomma en een tweede vervangingscommando:

sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt

Deze tip wordt geïllustreerd in de volgende afbeelding:

15. Sed en andere commando's combineren

Uiteraard kan sed worden gecombineerd met andere Linux-commando's om krachtigere commando's te creëren. Laten we bijvoorbeeld het voorbeeld uit TIP #4 gebruiken en ons IP-adres uit de uitvoer van het ip route-commando halen.

We beginnen met het afdrukken van alleen de regel waar het woord src staat. Vervolgens bouwen we meerdere ruimtes om tot één ruimte. Ten slotte schrappen we het 9e veld (waarbij we een enkele spatie als veldscheidingsteken beschouwen), waar het IP-adres staat:

ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9

De onderstaande afbeelding illustreert elke stap van de bovenstaande opdracht:

Samenvatting

In deze handleiding hebben we 15 sed-tips en -trucs gedeeld om u te helpen bij uw dagelijkse systeembeheertaken. Is er nog een andere tip die u regelmatig gebruikt en die u graag met ons en de rest van de community wilt delen?

Als dat zo is, laat het ons dan gerust weten via het onderstaande reactieformulier. Ook vragen en opmerkingen zijn welkom, wij horen graag van u!