GNU/Linux >> Znalost Linux >  >> Linux

3 nezbytné linuxové příkazy pro manipulaci s textem

Systémoví správci používají nespočetné množství nástrojů příkazového řádku a vy pravděpodobně pravidelně používáte tři popsané v tomto článku:grep , sed a awk . Ale znáte všechny způsoby, jak je můžete použít k manipulaci s textem? Pokud ne (nebo si nejste jisti), pokračujte ve čtení.

Než začnu, zde jsou původy názvů příkazů:

  1. grep :Podle Wikipedie název „pochází z ed příkaz g/re/p (g lobálně hledejte r pravidelné e xpression a p vytisknout odpovídající řádky), což má stejný účinek." ed je "řádkově orientovaný textový editor." Dokonce i pro někoho, kdo má rád příkazový řádek, se úprava souborů řádek po řádku zdá příliš staromódní, ale lidé museli začít s něčím v starověku ).
  2. sed :Název pochází z jeho hlavního použití, jako s tream ed itor.
  3. awk :Název pochází z iniciál jeho autorů (Aho, Weinberger a Kernighan). Pokud vám zní jméno Kernighan, je to proto, že tento kanadský počítačový vědec přispěl k vytvoření Unixu a je spoluautorem první knihy o jazyce C.

Je skvělé sledovat genealogický strom příkazů, ale opravdu záleží na tom, že tyto příkazy jsou velmi užitečné pro manipulaci s textem.

V následujících příkladech použiji soubor s názvem quotes.txt pro ilustraci použití příkazů. Zde je obsah tohoto souboru:

$ cat quotes.txt

"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55

"Not only does God play dice but... he sometimes throws them where they cannot be seen."
- Stephen Hawking

"I regard consciousness as fundamental..."
- Max Planck

"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan

"[T]he atoms or elementary particles themselves are not real; they form a world of potentialities or possibilities rather than one of things or facts."
- Werner Heisenberg

grep

Nejjednodušší způsob použití grep je:

$ grep universe quotes.txt

"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Tento příklad poskytuje řetězec, který se má hledat (vesmír) a místo, kde jej hledat (quotes.txt).

Pokud jsou v řetězci, který chcete prohledat, mezery, musíte je umístit do uvozovek:

$ grep "the universe" quotes.txt

"God does not play dice with the universe."
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Některé běžné varianty při použití grep jsou:

  • Ignorujte malá a velká písmena:grep -i string-to-search filename
  • Hledejte ve více souborech:grep -i string-to-search *.txt

Můžete vyhledat regulární výraz:

$ grep "191[0-9]" quotes.txt

- Albert Einstein, The Born-Einstein Letters 1916-55

Pokud chcete povolit rozšířené vzory regulárních výrazů pro použití symbolů jako + , ? , nebo | , můžete použít egrep příkaz, což je zkratka pro přidání -E příznak na grep . To také umožňuje vyhledávat více řetězců:

$ egrep -i "albe|hawk" quotes.txt

- Albert Einstein, The Born-Einstein Letters 1916-55
- Stephen Hawking

Chcete-li zobrazit řádky, které obsahují slovo „vesmír“ a další řádek (aby bylo zahrnuto jméno autora):

$ grep -i universe -A 1 quotes.txt

"God does not play dice with the universe."
- Albert Einstein, The Born-Einstein Letters 1916-55
--
"The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."
- Carl Sagan

Jak pravděpodobně tušíte, můžete zobrazit více řádky předáním jiného čísla. Nebo můžete předchozí řádky zobrazit pomocí parametru -B .

Zatím jsem ukázal grep běží samostatně, ale je velmi běžné mít to v řetězci příkazů:

$ echo "Authors who mentioned 'universe'"; cat quotes.txt | grep -i universe -A 1 | grep "^-"

- Albert Einstein, The Born-Einstein Letters 1916-55
- Carl Sagan

[ Také by vás mohlo zajímat 11 linuxových příkazů, bez kterých nemohu žít. ]

sed

Moje oblíbené použití pro sed je nahradit řetězce v souborech. Například:

$ cat quotes.txt | sed 's/universe/Universe/g'

Toto nahradí universe s Universe a pošlete výsledek na stdout . g příznak znamená "nahradit všechny výskyty řetězce v každém řádku."

Některé varianty jsou:

  • Nahraďte řetězec pouze v případě, že se nachází v prvních třech řádcích:
    sed '1,3 s/universe/Universe/g' quotes.txt
  • Nahraďte n -tý výskyt vzoru v řádku (například druhý výskyt):
    sed 's/universe/Universe/2' quotes.txt

Tyto příklady nemění původní soubor. Pokud chcete sed pro změnu souboru na místě použijte -i :

$ sed -i 's/universe/Universe/g' quotes.txt

Pokud použijete -i příznak, ujistěte se, že přesně víte, co a kolik výskytů bude ovlivněna, protože změní původní soubor. Chcete-li to zjistit, můžete spustit grep a nejprve vyhledejte vzor.

[ Chcete si vyzkoušet své schopnosti správce systému? Proveďte hodnocení dovedností ještě dnes. ]

awk

awk nástroj je velmi výkonný a nabízí mnoho možností pro zpracování textových souborů.

Většina situací, kdy používám awk zahrnují zpracování souborů se strukturou (sloupce), která je přiměřeně předvídatelná, včetně znaku použitého jako oddělovač sloupců.

Když awk zpracovává soubor, rozdělí každý řádek pomocí "oddělovače polí" (interní proměnná FS , což je ve výchozím nastavení znak mezera). Každé pole je přiřazeno pozičním proměnným ($1 obsahuje první pole, $2 obsahuje druhý a tak dále. $0 představuje celý řádek).

Na každý řádek můžete také použít filtry. Například:

$ cat quotes.txt | awk '/universe/ { print NR " - " $0 }'

1 - "God does not play dice with the universe."
10 - "The cosmos is within us. We are made of star-stuff. We are a way for the universe to know itself."

Příkazy předány awk používejte jednoduché uvozovky (je to jako předání miniprogramu, který má být interpretován):

  • /universe/ část říká awk vyberte pouze řádky, které odpovídají tomuto vzoru.
  • Hlavní program se nachází mezi složenými závorkami.
  • NR je interní proměnná, která obsahuje číslo aktuálního záznamu, například číslo aktuálního řádku.
  • Přidal jsem " -" provázek pro estetiku.

Interní proměnné v awk jsou:

  • NR :Celkový počet vstupních záznamů, které příkaz dosud viděl
  • NF :Počet polí v aktuálním vstupním záznamu
  • FS :Oddělovač vstupního pole (ve výchozím nastavení mezera)

Zde je příklad použití "předvídatelnějšího" formátu souboru:

$ cat /etc/passwd | awk '/nologin/ { FS=":"; print $1 }'

(output omitted)
...
redis
akmods
cjdns
haproxy
systemd-oom

V tomto posledním příkladu:

  • /nologin/ vybere pouze řádky, které obsahují tento vzor.
  • FS=": "; nastaví oddělovač polí na : místo výchozího (mezera).
  • print $1 vytiskne první pole v každém řádku (vzhledem k tomu, že oddělovač je : ).

Další informace

To bylo několik jednoduchých příkladů pro použití grep , sed a awk .

Pokud si přečtete man stránky pro každou z nich si všimnete spousty dalších parametrů a použití pro tyto užitečné příkazy.

Pro jednoduché případy použití a věci, které děláte jen jednou za čas, je vždy dobré mít takové nástroje v sadě nástrojů.

Pokud je požadovaná akce složitější, stojí za to zvážit, zda pro vás tyto nástroje stále mají smysl používat. Pro případ firemního použití nebo správu „všeho jako kódu“ doporučuji použít Ansible. Moduly Ansible mají podobné funkce, které vám umožňují emulovat operace popsané výše, s výhodou, že moduly Ansible mají obvykle idempotenci a že celý proces bude někde zdokumentován (například ve vašem interním repozitáři Git).


Linux
  1. Moje oblíbené linuxové příkazy pro optimalizaci webových obrázků

  2. 20 základních příkazů Linuxu pro každého uživatele

  3. 8 Linuxových příkazů pro efektivní řízení procesů

  1. 3 základní linuxové cheaty pro produktivitu

  2. Cheat sheet pro běžné linuxové příkazy

  3. 12 Užitečné příkazy pro filtrování textu pro efektivní operace se soubory v Linuxu

  1. 10 Linuxových příkazů pro diagnostiku sítě

  2. Příkazy Bash bang:Nezbytný trik pro příkazový řádek Linuxu

  3. Linux – Jak šáhnout po konkrétním slovu a uchopit text?