15 nyttige sed-kommandotip og -tricks til daglige Linux-systemadministrationsopgaver


Hver systemadministrator skal dagligt håndtere almindelige tekstfiler. At vide, hvordan man får vist visse sektioner, hvordan man udskifter ord, og hvordan man filtrerer indhold fra disse filer er færdigheder, som du skal have praktisk uden at skulle foretage en Google-søgning.

I denne artikel gennemgår vi sed, den velkendte streameditor, og deler 15 tip til at bruge den til at nå de tidligere nævnte mål og meget mere.

1. Visning af en række linjer i et dokument

Værktøjer som hoved og hale giver os mulighed for at se bunden eller toppen af en fil. Hvad hvis vi har brug for at se et afsnit i midten? Følgende sed one-liner returnerer linjer 5 til 10 fra myfile.txt:

# sed -n '5,10p' myfile.txt

2. Visning af hele filen undtagen et givet interval

På den anden side er det muligt, at du vil udskrive hele filen undtagen et bestemt interval. For at udelukke linjer 20 til 35 fra myfile.txt skal du gøre:

# sed '20,35d' myfile.txt

3. Visning af ikke-fortløbende linjer og intervaller

Det er muligt, at du er interesseret i sæt ikke-fortløbende linjer eller i mere end et interval. Lad os vise linier 5-7 og 10-13 fra myfile.txt:

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

Som du kan se, giver indstillingen -e os mulighed for at udføre en given handling (i dette tilfælde udskriv linjer) for hvert område.

4. Udskiftning af ord eller tegn (grundlæggende erstatning)

For at erstatte hver forekomst af ordet version med story i myfile.txt skal du gøre:

# sed 's/version/story/g' myfile.txt

Derudover kan du overveje at bruge gi i stedet for g for at ignorere store og små bogstaver:

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

For at erstatte flere blanke mellemrum med et enkelt mellemrum bruger vi output fra ip-ruteshow og en pipeline:

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

Sammenlign output fra ip-ruteshow med og uden pipeline:

5. Udskiftning af ord eller tegn inden for et interval

Hvis du kun er interesseret i at erstatte ord inden for et linjeinterval (f.eks. 30 til 40), kan du gøre:

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

Selvfølgelig kan du angive en enkelt linje gennem dens tilsvarende nummer i stedet for et interval.

6. Brug af regulære udtryk (avanceret erstatning) - I

Nogle gange indlæses konfigurationsfiler med kommentarer. Selvom dette bestemt er nyttigt, kan det være nyttigt kun at vise konfigurationsdirektiverne nogle gange, hvis du vil se dem alle på et øjeblik.

For at fjerne tomme linjer eller dem, der begynder med # fra Apache-konfigurationsfilen, skal du gøre:

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

Tegntegnet efterfulgt af nummertegnet (^#) angiver begyndelsen på en linje, mens ^$ repræsenterer tomme linjer. De lodrette søjler angiver boolske operationer, mens den bagudvendte skråstreg bruges til at undslippe de lodrette søjler.

I dette særlige tilfælde har Apache-konfigurationsfilen linjer med # s ikke i begyndelsen af nogle linjer, så * # bruges også til at fjerne dem.

7. Brug af regulære udtryk (avanceret erstatning) - II

For at erstatte et ord, der begynder med store eller små bogstaver med et andet ord, kan vi også bruge sed. For at illustrere, lad os erstatte ordet zip eller Zip med rar i myfile.txt:

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

8. Visning af linjer, der indeholder et givet mønster

En anden anvendelse af sed består i at udskrive linjerne fra en fil, der matcher et givet regulært udtryk. For eksempel kan vi være interesseret i at se godkendelses- og godkendelsesaktiviteterne, der fandt sted den 2. juli, i henhold til/var/log/sikker log på en CentOS 7-server.

I dette tilfælde er mønsteret, der skal søges efter, 2. juli i begyndelsen af hver linje:

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

9. Indsættelse af mellemrum i filer

Med sed kan vi også indsætte mellemrum (tomme linjer) for hver ikke-tomme linje i en fil. For at indsætte en tom linje hver anden linje i LICENSE, en almindelig tekstfil, skal du gøre:

# sed G myfile.txt

For at indsætte to tomme linjer skal du gøre:

# sed 'G;G' myfile.txt

Tilføj en stor G adskilt af et semikolon, hvis du vil tilføje flere tomme linjer. Følgende billede illustrerer eksemplet i dette tip:

Dette tip kan være nyttigt, hvis du vil inspicere en stor konfigurationsfil. Indsættelse af et tomt mellemrum hver anden linje og piping af output til mindre vil resultere i en mere venlig læseoplevelse.

10. Efterligning af dos2unix med indbygget redigering

Programmet dos2unix konverterer almindelige tekstfiler fra Windows/Mac-formatering til Unix/Linux og fjerner skjulte newline-tegn indsat af nogle teksteditorer, der bruges i disse platforme. Hvis det ikke er installeret i dit Linux-system, kan du efterligne dets funktionalitet med sed i stedet for at installere det.

På billedet til venstre kan vi se flere DOS newline-tegn (^M) , som senere blev fjernet med:

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

Bemærk, at indstillingen -i angiver redigering på stedet. Derefter returneres ændringer ikke på skærmen, men gemmes i filen.

Bemærk: Du kan indsætte DOS newline-tegn, mens du redigerer en fil i vim-editor med Ctrl + V og Ctrl + M .

11. Redigering og sikkerhedskopiering af originalfilen på stedet

I det forrige tip brugte vi sed til at ændre en fil, men gemte ikke den originale fil. Nogle gange er det en god ide at gemme en sikkerhedskopi af den originale fil i tilfælde af.

For at gøre dette skal du angive et suffiks efter indstillingen -i (inde i enkelte anførselstegn), der skal bruges til at omdøbe den originale fil.

I det følgende eksempel erstatter vi alle forekomster af dette eller dette (ignorerer tilfældet) med det i myfile.txt, og vi gemmer den originale fil som myfile.txt.orig.

Endelig bruger vi diff utility til at identificere forskellene mellem begge filer:

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

12. Skift af par af ord

Lad os antage, at du har en fil, der indeholder fulde navne i formatet Fornavn, Efternavn. For at behandle filen tilstrækkeligt kan du skifte efternavn og fornavn.

Vi kan gøre det med sed temmelig let:

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

På billedet ovenfor kan vi se, at parenteser, som specialtegn, skal undslippes, ligesom tallene 1 og 2.

Disse tal repræsenterer de fremhævede regulære udtryk (som skal vises inden for parenteser):

  1. 1 repræsenterer begyndelsen af hver linje op til kommaet.
  2. 2 er en pladsholder for alt, hvad der er ret til kommaet til slutningen af linjen.

Den ønskede output er angivet i formatet SecondColumn (Efternavn) + komma + mellemrum + FirstColumn (Fornavn). Du er velkommen til at ændre det til det, du ønsker.

13. Udskiftning af ord kun, hvis der findes et separat match

Nogle gange er det ikke nøjagtigt, hvad vi har brug for at erstatte alle forekomster af et givet ord eller et tilfældigt par. Måske er vi nødt til at udføre udskiftningen, hvis der findes en separat kamp.

For eksempel vil vi måske kun erstatte start med stop, hvis ordet services findes i samme linje. I dette scenarie er her hvad der vil ske:

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

I den første linje erstattes start ikke med stop, da ordet services ikke vises i den linje i modsætning til den anden linje.

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

14. Udførelse af to eller flere udskiftninger på én gang

Du kan kombinere to eller flere erstatninger en enkelt sed-kommando. Lad os erstatte de ord, der og linjen i myfile.txt med henholdsvis Dette og vers.

Bemærk hvordan dette kan gøres ved hjælp af en almindelig sed-substitutionskommando efterfulgt af et semikolon og en anden substitutionskommando:

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

Dette tip er illustreret i følgende billede:

15. Kombination af sed og andre kommandoer

Selvfølgelig kan sed kombineres med andre værktøjer for at skabe mere kraftfulde kommandoer. Lad os f.eks. Bruge eksemplet i TIP # 4 og udtrække vores IP-adresse fra output fra kommandoen ip route .

Vi begynder med kun at udskrive den linje, hvor ordet src er. Derefter konverterer vi flere mellemrum til en enkelt. Endelig vil vi klippe det 9. felt (betragter et enkelt mellemrum som feltseparator), hvor IP-adressen er:

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

Billedet nedenfor illustrerer hvert trin i ovenstående kommando:

Resumé

I denne vejledning har vi delt 15 sed tips og tricks til at hjælpe dig med dine daglige systemadministrationsopgaver. Er der noget andet tip, som du bruger regelmæssigt og gerne vil dele med os og resten af samfundet?

I så fald er du velkommen til at fortælle os ved hjælp af nedenstående kommentarformular. Spørgsmål og kommentarer er også velkomne - vi glæder os til at høre fra dig!