Vyhledávání na webu

15 tipů pro příkaz Sed pro úlohy správy systému Linux


Každý správce systému se musí denně potýkat se soubory ve formátu prostého textu. Vědět, jak zobrazit určité sekce, jak nahradit slova a jak filtrovat obsah z těchto souborů, jsou dovednosti, které musíte mít po ruce, aniž byste museli hledat na Googlu.

V tomto článku se podíváme na sed, známý editor streamů, a podělíme se o 15 tipů, jak jej používat ke splnění výše zmíněných cílů a další.

Co je Sed Command?

Příkaz 'sed', zkratka pro stream editor, je všestranný a výkonný nástroj pro manipulaci s textem, který pracuje s textovými toky a umožňuje uživatelům provádět různé operace s daty, jako je vyhledávání, nahrazování, vkládání a vymazat. ‚Sed‘ používá regulární výrazy k definování vzorů pro manipulaci s textem a lze jej použít pro úlohy dávkové úpravy a zpracování textu ve skriptech.

Jednou z jeho pozoruhodných funkcí je editace na místě, kde může upravovat soubory přímo nebo vytvářet záložní kopie při provádění změn. „Sed“ je nezbytný nástroj pro systémové administrátory, programátory a kohokoli, kdo se zabývá transformací textu a manipulací s daty v příkazovém řádku.

Níže jsou uvedeny některé běžné příkazy „sed“ s příklady:

1. Zobrazení rozsahu řádků souboru

Nástroje jako hlava a ocas nám umožňují zobrazit spodní nebo horní část souboru. Co když potřebujeme zobrazit sekci uprostřed? Následující jednořádkový řádek vrátí řádky 510 z tecmint.txt:

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

2. Zobrazení celého souboru kromě daného rozsahu

Na druhou stranu je možné, že chcete vytisknout celý soubor kromě určitého rozsahu. Chcete-li ze souboru tecmint.txt vyloučit řádky 2035, postupujte takto:

sed '20,35d' myfile.txt

3. Zobrazení nesouvislých čar a rozsahů

Je možné, že vás zajímá sada řádků, které po sobě nejdou, nebo více než jeden rozsah. Zobrazme řádky 5-7 a 10-13 z tecmint.txt:

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

Jak vidíte, volba -e nám umožňuje provést danou akci (v tomto případě tisk řádků) pro každý rozsah.

4. Nahrazení slov nebo řetězců v souboru

Chcete-li nahradit každý výskyt slova version výrazem příběh v souboru tecmint.txt, postupujte takto:

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

Kromě toho můžete zvážit použití gi místo g, abyste ignorovali velká a malá písmena:

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

K nahrazení více prázdných míst jednou mezerou použijeme výstup příkazu ip route show s potrubím:

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

Porovnejte výstup ip route show s kanálem a bez něj:

5. Nahrazování slov nebo řetězců uvnitř rozsahu

Pokud chcete nahrazovat slova pouze v rozsahu řádků (například 3040), můžete:

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

Samozřejmě můžete místo rozsahu označit jeden řádek jeho odpovídajícím číslem.

6. Odstraňte komentáře ze souboru

Někdy jsou konfigurační soubory načteny s komentáři. I když je to jistě užitečné, může být užitečné někdy zobrazit pouze konfigurační direktivy, pokud si je chcete prohlédnout všechny na první pohled.

Chcete-li z konfiguračního souboru Apache odstranit prázdné řádky nebo řádky začínající #, postupujte takto:

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

Za znakem stříšky následuje znak čísla (^#) označuje začátek řádku, zatímco ^$ představuje prázdné řádky. Svislé pruhy označují booleovské operace, zatímco zpětné lomítko se používá k opuštění svislých pruhů.

V tomto konkrétním případě má konfigurační soubor Apache řádky s #’s, které nejsou na začátku některých řádků, takže *# se používá i k jejich odstranění.

7. Nahraďte slovo v souboru, které nerozlišuje malá a velká písmena

Chcete-li nahradit slovo začínající velkým nebo malým písmenem jiným slovem, můžeme také použít sed. Pro ilustraci nahradíme slovo zip nebo Zip výrazem rar v souboru tecmint.txt:

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

8. Vyhledání konkrétních událostí v souboru protokolu

Další využití sed spočívá v tisku řádků ze souboru, který odpovídá danému regulárnímu výrazu. Můžeme mít například zájem o zobrazení autorizace a ověřování, které proběhly 2. července podle /var /log/secure přihlaste se k serveru CentOS.

V tomto případě je vzor, který se má hledat, 2. července na začátku každého řádku:

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

9. Vkládání mezer nebo prázdných řádků do souboru

Pomocí sed můžeme také vkládat mezery (prázdné řádky) pro každý neprázdný řádek v souboru. Chcete-li vložit jeden prázdný řádek na každý druhý řádek do LICENSE, souboru prostého textu, postupujte takto:

sed G tecmint.txt

Chcete-li vložit dva prázdné řádky, postupujte takto:

sed 'G;G' tecmint.txt

Chcete-li přidat další prázdné řádky, přidejte velké G oddělené středníkem. Následující obrázek ilustruje příklad uvedený v tomto tipu:

Tento tip se může hodit, pokud chcete zkontrolovat velký konfigurační soubor. Vložením prázdného místa na každý druhý řádek a snížením počtu výstupů bude čtení příjemnější.

10. Odebrání ^M ze souboru

Program dos2unix převádí soubory ve formátu prostého textu z formátování Windows/Mac na Unix/Linux a odstraňuje skryté znaky nového řádku vložené některými textovými editory používanými na těchto platformách. Pokud není nainstalován ve vašem systému Linux, můžete místo instalace napodobit jeho funkce pomocí sed.

Na obrázku vlevo můžeme vidět několik znaků nového řádku DOSu (^M), které byly později odstraněny pomocí:

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

Upozorňujeme, že možnost -i označuje úpravy na místě. Poté se změny nevrátí na obrazovku, ale uloží se do souboru.

Poznámka: Znaky nového řádku DOS můžete vložit při úpravě souboru v editoru Vim pomocí Ctrl+V a Ctrl+M.

11. Vytvořte záložní soubor pomocí příkazu Sed

V předchozím tipu jsme použili sed k úpravě souboru, ale neuložili jsme původní soubor. Někdy je dobré si pro jistotu uložit záložní kopii původního souboru.

Chcete-li to provést, uveďte příponu za volbou -i (v jednoduchých uvozovkách), která se použije k přejmenování původního souboru.

V následujícím příkladu nahradíme všechny výskyty this nebo This (bez ohledu na malá a velká písmena) tím v myfile.txt a uložíme původní soubor jako myfile.txt.orig.

Nakonec použijeme nástroj diff k identifikaci rozdílů mezi oběma soubory:

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

12. Přepínání dvojic slov v souboru

Předpokládejme, že máte soubor obsahující celá jména ve formátu Jméno, Příjmení. Chcete-li soubor adekvátně zpracovat, možná budete chtít přepnout Příjmení a Jméno.

Můžeme to udělat pomocí sed poměrně snadno:

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

Na obrázku výše vidíme, že závorky, které jsou speciálními znaky, je třeba escapovat, stejně jako čísla 1 a 2.

Tato čísla představují zvýrazněné regulární výrazy (které se musí objevit v závorkách):

  • 1 představuje začátek každého řádku až po čárku.
  • 2 je zástupný symbol pro vše, co je napravo od čárky na konec řádku.

Požadovaný výstup je uveden ve formátu SecondColumn (Příjmení) + čárka + mezera + FirstColumn (Jméno). Klidně to změňte na cokoliv si budete přát.

13. Nahrazování slov Pouze v případě, že je nalezena samostatná shoda

Někdy nahrazení všech výskytů daného slova nebo několika náhodných slov není přesně to, co potřebujeme. Možná budeme muset provést výměnu, pokud bude nalezena samostatná shoda.

Například můžeme chtít nahradit start výrazem stop pouze v případě, že se na stejném řádku nachází slovo služby. V tomto scénáři se stane toto:

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

V prvním řádku nebude výraz start nahrazen výrazem stop, protože slovo služby se v tomto řádku na rozdíl od druhého řádku neobjevuje.

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

14. Provádění dvou nebo více substitucí najednou

V jednom příkazu sed můžete kombinovat dvě nebo více substitucí. Nahraďte slova that a line v myfile.txt slovy This a verse, v daném pořadí.

Všimněte si, jak to lze provést pomocí běžného substitučního příkazu sed následovaného středníkem a druhým substitučním příkazem:

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

Tento tip je znázorněn na následujícím obrázku:

15. Kombinace příkazů Sed a dalších

sed lze samozřejmě kombinovat s dalšími příkazy Linuxu za účelem vytvoření výkonnějších příkazů. Použijme například příklad uvedený v TIP #4 a extrahujeme naši IP adresu z výstupu příkazu ip route.

Začneme tiskem pouze řádku, kde je slovo src. Poté převedeme více prostorů do jednoho. Nakonec vyřízneme 9. pole (s ohledem na jednu mezeru jako oddělovač polí), kde je IP adresa:

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

Obrázek níže ilustruje každý krok výše uvedeného příkazu:

souhrn

V této příručce jsme sdíleli 15 tipů a triků, které vám pomohou s každodenními úkoly správy systému. Existuje nějaký další tip, který pravidelně používáte a chtěli byste se s námi a zbytkem komunity podělit?

Pokud ano, dejte nám vědět pomocí níže uvedeného formuláře pro komentáře. Dotazy a komentáře jsou také vítány – těšíme se na vaši odpověď!