Také známý jako reverzní kočka, tac jednoduchý nástroj příkazového řádku, který vám umožní obrátit řádky ve výstupu pomocí | vestavěný provozovatel potrubí a TAC. To znamená, že pokud máte příkaz na levé straně (lhs) a chcete zvrátit obsah jeho výstupu, vše, co byste udělali, je zadat lhs | tac. A je to!
Je pravda, že tac je více, než se na první pohled zdá. Nedělej si starosti. Vše včas pokryjeme.
Poradenství na tac
To je nebo není, to je otázka. Nebudete chtít tac, když nemusíte. Pokud však chcete rozšířit tac jako svůj příkaz chleba a másla, je to na vás. Mezitím je moje rada ohledně toho, aby obě strany zůstaly neutrální.
Kdy použít tac
Jsou chvíle, kdy použít tac, které vám pomohou získat více z příkazového řádku s méně kódem a časem stráveným zkoumáním možností příkazu lhs.
Pokud si nejste jisti možnostmi lhs
Mnoho příkazů, jako je sort, má možnost zvrátit výstup příkazu. Pokud si však nejste jisti, zda má příkaz na levé straně možnost -r pro reverzní výstup, použití tac je jistý způsob, jak obrátit výstupní řádky.
Když na výkonu nezáleží
I když je to nevýznamné, většina příkazů používaných ve spojení s integrovanou možností reverzního výstupu funguje lépe než pipování výstupu do tac. Pokud tedy malé zpoždění výkonu není problém, pipování do tac pro opakované přehrání výstupu je v pořádku.
Kdy nepoužívat tac
Jsou chvíle, kdy nemusíte používat tac, protože to víte lépe. Zde je několik poznámek.
Pokud víte, že příkaz na lhs má možnost obrátit výstupní řádky
Jak jsem řekl: „Většina příkazů přichází s možností zpětného výstupu.„Pokud víte, že konkrétní příkaz lhs má možnost, nemusíte použít tac. Koneckonců, -r je kratší než - | tac.
Když záleží na výkonu
Jak jsem řekl: „Použití možnosti lhs reverse může fungovat lépe než tac.„Pokud hledáte vytlačit několik sekund v bash skriptu nebo máte co do činění s většími soubory, které vyžadují čas na přečtení, nemusíte používat tac.
Tac pomoc
Spuštění příkazu nápovědy pro tac nebo man tac ukazuje využití spolu s možnostmi, které lze použít. Zde je to, co můžete očekávat.
Příkazy
tac - pomocVýstup
Tac verze
Jaká jsem verze??
Jste nejnovější verzí sebe sama. V případě, v jaké verzi je váš tac, však existuje možnost.
Příkazy
tac - verzeVýstup
Poznámky
Pokud používáte tac na FreeBSD nebo macOS, dlouhá možnost pro verzi nemusí být k dispozici. V takovém případě zkuste -v nebo man tac. Pokud jste to zkusili, dejte mi vědět. jsem zvědav. dík
Možnosti TAC
Vedle nápovědy a verze nemá tac mnoho možností. Za to, co má, určitě zjistíte, že tac není jen tak nějaká stará reverzní kočka.
Možnost Tac before
Možnost -b umožňuje změnit způsob připojení oddělovače ve výstupu. Ve výchozím nastavení je za každým řádkem připojen oddělovač nového řádku.
Vím, že je to matoucí. Pojďme si to rozdělit na příkladu.
Nejprve se podívejme, jak vypadá náš výstup před použitím tac -b.
Příkazy
seq 10Výstup
Nyní se podívejme, na co se náš výstup promění po použití tac bez -b.
Příkazy
č. 10 | tacVýstup
Nyní se podívejme, na co se výstup promění pomocí tac -b.
Příkazy
č. 10 | tac -bVýstup
Možnost oddělovače Tac
Možnost oddělovače -s 'literal string' vám umožňuje určit znak nebo posloupnost znaků, které používá tac k odlišení řádků. Ve výchozím nastavení se používá znak nového řádku ('0a' v hexadecimálním formátu).
Jak používat možnost oddělovače tac není zpočátku zřejmé. Jakmile však víte, že tam je, je těžké se ho nepokoušet použít.
Zvažte následující příklad, fungující na řádcích znázorněných v šestnáctce.
Příkazy
seq 20 | xxd -ps | tac -s '0a' | xxd -ps -rVýstup
Poznámky
(1) Může se to zdát triviální, jako když používáte seq 20 | Příkaz tac jsme však v takovém případě nestrávili čas prací na výstupním proudu v hexadecimálním formátu. Použití tohoto vzoru je užitečné, když oddělený není něco triviálního jako nový znak řádku, jako je nula bajtu.
Nyní už zkuste použít tac na něco trochu méně surového a meta jako jednoduchý HTML.
Zvažte následující soubor.
Soubor
AB
C
Příkazy
file () echo -e "AB
C
";
soubor | tac -s "
"
Výstup
Podařilo se nám převést stránku HTML
AB
C
do
CB
A
pomocí tac.
Předpokládejme, že musíte udělat něco trochu komplikovanějšího, jako je zacházet s jakoukoli značkou jako s oddělovačem tac. V takovém případě se nedostanete pryč pouze s použitím možnosti oddělovače samostatně. To je místo, kde přichází možnost regex. V kombinaci s možností oddělovače vám umožní dělat s příkazem tac více, než obrátit řádek v souboru. Zde je návod.
Možnost Tac regex
Možnost regex -r -s 'regex' vám umožňuje určit, že s oddělovacím řetězcem bude zacházeno jako s regulárním výrazem.
Jak používat možnost tac regex je stejně snadné jako přidání volby -r před nebo za oddělovač.
Zvažte předchozí příklad pomocí možnosti regex ve spojení s možností oddělovače. Pojďme tac považovat jakoukoli značku značek za oddělovač.
Soubor
jednoduché funkce
Funkce jsou v bash jednoduché. Alespoň tento je. Vloží řetězec na obrazovku.
Příkazy
jednoduchá funkce
()
echo
tak jednoduché, jak to jen jde jednoduchá funkce
Zdroj: https: // temptemp3.github.io / bash funkce
Příkazy
soubor ()ozvěna '
jednoduché funkce
Funkce jsou v bash jednoduché. Alespoň tento je. Klade to
řetězec na obrazovce.
Příkazy
jednoduchá funkce
()
echo tak jednoduché, jak to jen jde
jednoduchá funkce
soubor | tac -r -s "] *."
Výstup
Podařilo se nám převést stránku HTML, která obrátila soubor pomocí značek HTML. Pokud se podíváte do podrobností, zjistíte, že to ještě není dokonalé.
Tac příkaz v čistém bash
Zde je primitivní verze tac implementace v čistém bash, která obrací řádky přiváděné příkazem lhs. Budoucí verze jsou ponechány jako cvičení.
#!/ bin / bash## tac
## verze 0.0.1 - počáteční
#######################################################
tac ()
místní -a arr
místní -i i
arr. mapfile -
i = "$ # arr [@]"
while [$ i -ge 0]
dělat
echo $ arr [i]
nechť i- = 1
Hotovo
#######################################################
tac
#######################################################
Zdroj: https: // github.com / temptemp3 / ba.sh / blob / master / tac.sh
Příkaz Tac pomocí jiných příkazů
Zde jsou některé primitivní verze implementace tac využívající jiné příkazy, které obracejí řádky přiváděné příkazem lhs. Budoucí verze jsou ponechány jako cvičení.
Než začneme, zavřete oči a přemýšlejte: „Co by bylo možné použít k implementaci primitivní verze tac?“
Mnoho příkazů mi přijde na mysl, ale já se zaměřím na ty, pro které máme prostor.
gawk
Podobně jako příkaz Tac v příkladu čistého bash, pro implementaci tac bychom nejprve uložili čtecí řádky, které se mají přehrát v opačném pořadí po přečtení všech řádků. Takto by to vypadalo pomocí gawku.
gawk 'line [++ line [0]] = $ (0) END for (i = 0; i
Nyní zkuste použít příkaz lhs seq 10.
č. 10 | gawk 'line [++ line [0]] = $ (0) END for (i = 0; i
Jak byste očekávali, výstup je
Cvičení
1. Funkce lhs () seq 10; seznam celých čísel 1 až 10. Vypište příkaz rhs tak, aby lhs | rhs se rovná 10864213579 pouze s použitím tac (Tip: viz Tac před příkladem možnosti)
2. Obrátit výstup rhs () find -mindepth 1 -maxdepth 1 -print0; using tac (Tip: see Tac separator option example)
3. Prodloužit tac.sh (v příkazu Tac v čistém bash), aby se choval přesně jako tac. Budete muset přidat možnosti a ověřit jejich chování.
4. Implementujte primitivní verzi tac v čistém bash jako rekurzivní funkci.
TL; DR
Opět se mi líbilo psát příkaz Bash tac. Po přečtení doufám, že můžete souhlasit s tím, že je toho ještě víc, než jste si mysleli. Také po pokusu dělat věci tvrdě u dna doufám, že víte, jak užitečný by mohl být příkaz tac. Pokud někdo zvládne některá cvičení dokončit nebo potřebuje pomoc s domácími úkoly, dejte mi vědět. dík,