Prawdziwy admin potrafi zmienić świat jedną komendą sed .
– Mądrość ludu z bash
Czym jest sed?
sed to edytor strumieniowy. Co to znaczy? To znaczy, że czyta tekst (z pliku lub ze standardowego wejścia) linia po linii, przetwarza go według podanych instrukcji, a następnie wypisuje wynik na standardowe wyjście. Ważne: domyślnie sed nie modyfikuje oryginalnego pliku! Wynik jest drukowany na ekranie, co daje Ci szansę sprawdzić, czy nie zrobiłeś bałaganu.
Podstawowa składnia: sed ‘adres_polecenie’ plik
Większość operacji w sed wymaga określenia:
- adresu (które linie mają zostać zmodyfikowane – opcjonalnie, jeśli brak, to wszystkie)
- polecenia (co ma zostać zrobione z tekstem)
sed [opcje] 'polecenie' plikPodstawowe operacje: Działamy na tekście!
Zamiana tekstu (s – substitution): Najpopularniejszy trik
To jest to, co ludzie robią przy pomocy sed najczęściej – zamieniają jedno słowo na drugie.
# Podstawowa zamiana: `s/stary/nowy/` zamieni TYLKO pierwsze wystąpienie "stary" w każdej linii
sed 's/stary/nowy/' plik.txt
# Globalna zamiana: `s/stary/nowy/g` zamieni WSZYSTKIE wystąpienia "stary" w każdej linii (`g` jak global)
sed 's/stary/nowy/g' plik.txt
# Zamiana tylko drugiego wystąpienia w linii: `s/stary/nowy/2`
sed 's/stary/nowy/2' plik.txtA teraz wisienka na torcie – jak zapisać zmiany do pliku!
# OSTRZEŻENIE! To nadpisuje oryginalny plik. Używaj ostrożnie.
sed -i 's/stary/nowy/g' plik.txt
# Lepsza opcja: utwórz kopię zapasową oryginalnego pliku (`.bak`)
sed -i.bak 's/stary/nowy/g' plik.txt<b><i>UWAGA</i></b>: Używanie flagi `-i` (in-place) jest super wygodne, ale też super niebezpieczne! Nadpisuje oryginalny plik bez pytania. ZAWSZE najpierw przetestuj swoje polecenie <b><i>sed</i></b> bez `-i` (lub z `-i.bak`), aby upewnić się, że robi dokładnie to, co chcesz. Nie ma Ctrl+Z dla nadpisanego pliku!
Wybór linii (adresowanie): Działaj precyzyjnie!
sed potrafi operować na konkretnych liniach lub zakresach linii.
# Wydrukuj TYLKO linię numer 5 (`-n` dla "suppress automatic printing", `p` dla "print")
sed -n '5p' plik.txt
# Wydrukuj zakres linii od 1 do 10
sed -n '1,10p' plik.txt
# Wydrukuj co drugą linię, zaczynając od pierwszej
sed -n '1~2p' plik.txt
# Wydrukuj linie od słowa "START" do słowa "END"
sed -n '/START/,/END/p' plik.txtUsuwanie linii (d – delete): Gdy coś nie pasuje!
# Usuń linię numer 10
sed '10d' plik.txt
# Usuń linie od 5 do 15
sed '5,15d' plik.txt
# Usuń puste linie (`^$` to regex dla pustej linii)
sed '/^$/d' plik.txt
# Usuń wszystkie linie zawierające słowo "debug"
sed '/debug/d' plik.txtWyrażenia regularne w sed: Tutaj zaczyna się jazda!
Podobnie jak grep, sed potrafi wykorzystywać pełną moc wyrażeń regularnych. To pozwala na bardzo skomplikowane i precyzyjne modyfikacje tekstu.
# Usuń linie zaczynające się od "#" (komentarze)
sed '/^#/d' plik.txt
# Usuń linie zakończone spacją
sed '/ $/d' plik.txt
# Zamień wszystkie cyfry (0-9) na znak "X"
sed 's/[0-9]/X/g' plik.txt
# Maska adresów IP w logach: zastąp cały adres IP ciągiem [REDACTED]
sed -E 's/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[REDACTED]/g' access.logPraktyczne przykłady z bezpieczeństwa: sed jako narzędzie stealth!
Czyszczenie logów przed udostępnieniem: Anonimizacja to podstawa!
# Usuń lub zamaskuj wrażliwe dane (hasła, tokeny, sekrety) z logów
sed -i -E 's/(password|token|secret)=[^& ]*/\1=***/gi' app.log
# Zastąp adresy IP wewnętrzne (np. z sieci 192.168.x.x) ogólnymi maskami
sed -i 's/192\.168\.[0-9]*\.[0-9]*/192.168.x.x/g' access.logPrzetwarzanie wielu plików: Szybki lifting całej paczki!
# Zastosuj komendę **sed** do wszystkich plików `.log` w bieżącym katalogu
for f in *.log; do
sed -i 's/stary/nowy/g' "$f"
doneŁączenie poleceń (pipeline): sed jako ogniwo łańcucha!
sed świetnie współpracuje z innymi narzędziami w potokach.
# Wyciągnij błędy z logu (`grep`), usuń znaczniki czasu (**sed**), posortuj, zlicz unikalne, posortuj od największych
grep -i error server.log | sed 's/\[.*\] //' | sort | uniq -c | sort -rn
# Wyciągnij adresy IP z pliku (`grep`), posortuj, zlicz unikalne
grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log | sort | uniq -cZaawansowane triki: Magia dla wtajemniczonych
Użycie & – odwołanie do dopasowanego tekstu
Symbol & w części zamieniającej odwołuje się do całego tekstu, który został dopasowany przez wyrażenie regularne.
# Otocz cały dopasowany tekst nawiasami kwadratowymi
echo "test" | sed 's/.*/[&]/'
# Wynik: [test]
# Dodaj prefix "[REDACTED]" przed każdym znalezionym słowem "ip"
sed 's/ip/[REDACTED] &/' plik.txtGrupy przechwytujące (‘(…)’ i ‘\1’, ‘\2’): Manipuluj fragmentami!
Możesz “przechwytywać” fragmenty dopasowanego tekstu za pomocą nawiasów, a następnie odwoływać się do nich (\1, \2) w części zamieniającej.
# Odwróć kolejność słów oddzielonych dwukropkiem (zamień "słowo1:słowo2" na "słowo2:słowo1")
echo "foo:bar" | sed -E 's/([^:]+):(.+)/\2:\1/'
# Wynik: bar:fooOperacje na wielu wzorcach: Jeden sed, wiele zadań!
Możesz wykonać wiele poleceń sed w jednym wywołaniu, oddzielając je średnikami lub używając -e.
# Usuń pierwszą i ostatnią linię pliku
sed '1d; $d' plik.txt
# To samo, ale bardziej czytelnie z `-e`
sed -e '1d' -e '$d' plik.txtPodsumowanie: sed to Twój najlepszy przyjaciel!
sed to potężne, ale i niebezpieczne narzędzie. Opanowanie go to skok milowy w produktywności i umiejętnościach analitycznych w terminalu.
Kluczowe punkty do zapamiętania:
- sed to edytor strumieniowy – modyfikuje tekst linia po linii, domyślnie wypisując na standardowe wyjście.
- Flaga -i nadpisuje plik – używaj z największą ostrożnością!
- Zamiana (s), usuwanie (d), adresowanie (linia,linia) to podstawa.
- Wyrażenia regularne to turbo-doładowanie dla sed.
- Idealny do masowych zmian, anonimizacji logów i skryptowania.
# Twój nowy zestaw do ogarniania masowych zmian:
find /var/log -name "*.log" | xargs sed -i.bak 's/hasło/***/g'sed (Stream Editor) to potężny edytor strumieniowy, który pozwala na błyskawiczną modyfikację tekstu bez otwierania plików. Idealnie sprawdza się w automatyzacji, anonimizacji logów i masowych zamianach. Kluczowe funkcje to zamiana tekstu (s), usuwanie linii (d) oraz precyzyjne adresowanie zakresów, a wszystko to wspierane przez potęgę wyrażeń regularnych.
Kolejny odcinek: find + locate – wyruszymy na prawdziwe polowanie na pliki! Zostań z nami!