Linux-opdrachten

Bash Tac Commando

Bash Tac Commando
Tac is een van die commando's die je pas beseft als je het al gedaan hebt, het wiel opnieuw hebt uitgevonden, wat niet ongebruikelijk is in de praktijk van het programmeren, of je nu net de kneepjes van het vak leert of een professional bent met jarenlange ervaring om opscheppen, je bent geweldig. Als je handen schoon zijn, dan is dat goed voor je; Hoe dan ook, je staat voor een traktatie, ik ga alles lossen wat ik weet over het tac-commando en meer. Lees verder.

Ook bekend als reverse cat, tac is een eenvoudig hulpprogramma voor de opdrachtregel waarmee u regels in uitvoer kunt omkeren met behulp van de | ingebouwde pijpoperator en tac. Dat wil zeggen, als je een commando hebt, links (lhs), en je wilt de inhoud van de uitvoer omkeren, dan typ je alleen maar lhs | tac. Dat is het!

Toegegeven, er komt meer bij kijken dan op het eerste gezicht lijkt. Maak je geen zorgen. We zullen het allemaal op tijd behandelen.

Advies over tac

Wel of niet gebruiken, dat is de vraag. Je wilt niet tac als het niet hoeft. Als u echter tac wilt verspreiden als uw brood- en botercommando, is dat aan u. In de tussentijd is hier mijn advies over het nemen van beide kanten om neutraal te blijven.

Wanneer tac . gebruiken

Er zijn momenten waarop u tac moet gebruiken waarmee u meer uit de opdrachtregel kunt halen met minder code en tijd besteed aan het onderzoeken van lhs-opdrachtopties.

Wanneer u niet zeker bent van de opties van lhs

Veel commando's zoals sorteren hebben een optie om de uitvoer van een commando om te keren. Als u echter niet zeker weet of een opdracht aan de linkerkant een -r-optie heeft om de uitvoer om te keren, is het gebruik van tac een zekere manier om de uitvoerregels om te keren.

Wanneer prestaties er niet toe doen

Hoewel onbeduidend, presteren de meeste commando's die worden gebruikt in combinatie met een ingebouwde optie om uitvoer om te keren, beter dan de uitvoer naar tac te leiden. Dus als een beetje prestatievertraging geen probleem is, is het in orde om in tac te pipen om de uitvoer omgekeerd af te spelen.

Wanneer tac . niet gebruiken

Er zijn momenten waarop u tac misschien niet gebruikt omdat u beter weet. Hier zijn er een paar om op te merken.

Als je weet dat de opdracht op de lhs een optie heeft om uitvoerregels om te keren

Zoals ik al zei: "De meeste commando's hebben een optie om de uitvoer om te keren.” Als u weet dat een specifiek lhs-commando een optie heeft, mag u tac . niet gebruiken. -r is immers korter dan - | tac.

Wanneer prestaties ertoe doen

Zoals ik al zei: “Het gebruik van de lhs reverse-optie kan beter presteren dan tac.Als u een paar seconden in een bash-script wilt persen of te maken hebt met grotere bestanden die tijd nodig hebben om te lezen, mag u tac niet gebruiken.

Tac hulp

Het uitvoeren van de help-opdracht voor tac of man tac toont het gebruik samen met de opties die kunnen worden gebruikt. Dit is wat je kunt verwachten.

Commando's

tac --help

Uitgang:

Tac-versie

Welke versie ben ik??
Jij bent de nieuwste versie van jezelf. In het geval van welke versie uw tac is, is daar echter een optie voor.

Commando's

tac --versie

Uitgang:

Opmerkingen:

Als je tac gebruikt op FreeBSD of macOS, is de lange optie voor versie mogelijk niet beschikbaar. Probeer in dat geval -v of man tac. Als je het geprobeerd hebt laat het me weten. ik ben nieuwsgierig. Bedankt

Tac-opties

Naast hulp en versie heeft tac niet veel opties. Voor wat het heeft, zul je zeker ontdekken dat tac niet zomaar een oude omgekeerde kat is.

Tac voor optie

Met de optie -b kunt u wijzigen hoe het scheidingsteken wordt toegevoegd aan de uitvoer. Standaard wordt het scheidingsteken voor nieuwe regels toegevoegd na elke regel.

Ik weet dat het verwarrend is. Laten we het per voorbeeld opsplitsen.

Laten we eerst eens kijken hoe onze uitvoer eruitziet voordat we tac -b . gebruiken.

Commando's

volgende 10

Uitgang:

Laten we nu eens kijken wat onze uitvoer wordt na het gebruik van tac zonder -b.

Commando's

volgende 10 | tac

Uitgang:

Laten we nu eens kijken wat de uitvoer wordt met tac -b.

Commando's

volgende 10 | tac -b

Uitgang:

Tac-scheidingsteken optie

Met de scheidingstekenoptie -s 'letterlijke tekenreeks' kunt u het teken of de reeks tekens specificeren die door tac worden gebruikt om regels uit elkaar te houden. Standaard wordt het teken voor de nieuwe regel ('0a' in hex) gebruikt.

Het gebruik van de optie voor het scheidingsteken voor tac is in eerste instantie niet duidelijk. Maar als je eenmaal weet dat het er is, is het moeilijk om het niet te gebruiken.

Beschouw het volgende voorbeeld, werkend op lijnen weergegeven in hex.

Commando's

volgende 20 | xxd -ps | tac -s '0a' | xxd -ps -r

Uitgang:

Opmerkingen:

(1) Het lijkt misschien triviaal als het gebruik van de volgende 20 | tac-commando, maar in dat geval hebben we geen tijd besteed aan het werken aan de uitvoerstroom in hex. Het gebruik van dit patroon is handig wanneer de afzonderlijke niet iets triviaals is als het teken van de nieuwe regel, zoals de nulde byte.

Probeer nu minder tac te gebruiken op iets minder rauw en meer meta zoals eenvoudige HTML.

Beschouw het volgende bestand:.

het dossier

EEN
B
C

Commando's

bestand () echo -e " A
B
C
";
bestand | tac -s "
"

Uitgang:

We zijn erin geslaagd om de HTML-pagina te converteren

EEN
B
C

in

C
B
EEN

met behulp van tac.

Stel dat u iets ingewikkelders moet doen, zoals een tag behandelen als een tac-scheidingsteken. In dat geval kom je er niet mee weg door alleen de scheidingstekenoptie te gebruiken. Dat is waar de regex-optie binnenkomt. In combinatie met de scheidingstekenoptie kunt u meer doen met het tac-commando dan een regel in een bestand omkeren. Hier is hoe.

Tac regex optie

Met de regex-optie -r -s 'regex' kunt u specificeren dat de scheidingstekenreeks moet worden behandeld als een reguliere expressie.

Het gebruik van de tac regex-optie is net zo eenvoudig als het toevoegen van de -r-optie voor of na het scheidingsteken.

Beschouw het vorige voorbeeld met behulp van de regex-optie in combinatie met de scheidingstekenoptie. Laten we elke markup-tag behandelen als een scheidingsteken.

het dossier



eenvoudige functies


Functies zijn eenvoudig in bash. Deze is tenminste. Het zet een string op het scherm.


Commando's


eenvoudige functie
()
echo
zo simpel als het wordt eenvoudige functie

Bron: https://temptemp3.github.io/bash-functies

Commando's

het dossier ()

echo'



eenvoudige functies

Functies zijn eenvoudig in bash. Deze is tenminste. Het zet een
tekenreeks op het scherm.

Commando's



eenvoudige functie

(
)

echo zo simpel als het wordt

eenvoudige functie
'

bestand | tac -r -s "]*."

Uitgang:

We zijn erin geslaagd om de HTML-pagina te converteren door het bestand om te keren met behulp van HTML-tags. Als je naar de details kijkt, zul je merken dat het nog niet perfect is.

Tac-commando in pure bash

Hier is een primitieve versie van tac-implementatie in pure bash die de regels omkeert die zijn ingevoerd door een lhs-opdracht. Toekomstige versies worden overgelaten als een oefening.

#!/bin/bash
## tac
## versie 0.0.1 - initiaal
##################################################
tac()
lokaal -a arr
lokaal -i i
mapfile arr -
i="$#arr[@]"
terwijl [ $i -ge 0 ]
Doen
echo $arr[i]
laat ik-=1
gedaan

##################################################
tac
##################################################

Bron: https://github.com/temptemp3/ba.sh/blob/master/tac.sh

Tac-commando met andere commando's

Hier zijn enkele primitieve versies van tac-implementatie die andere opdrachten gebruiken die de regels omkeren die zijn ingevoerd door een lhs-opdracht. Toekomstige versies worden overgelaten als een oefening.

Voordat we beginnen, sluit je ogen en denk: "Wat zou kunnen worden gebruikt om een ​​primitieve versie van tac?”
Veel commando's komen in me op, maar ik zal me concentreren op degenen waar we ruimte voor hebben.

gawk

Vergelijkbaar met het Tac-commando in het pure bash-voorbeeld, om tac te implementeren, zouden we eerst de gelezen regels opslaan om in omgekeerde volgorde te worden afgespeeld nadat alle regels zijn gelezen. Hier is hoe het eruit zou zien met behulp van gawk.

 gawk ' line[++line[0]]=$(0)  END  for(i=0;i

Probeer nu het lhs-commando seq 10 . te gebruiken.

 volgende 10 | gawk '  line[++line[0]]=$(0)  END  for(i=0;i

Zoals je zou verwachten is de output:

Opdrachten

1. De functie lhs() seq 10; geeft de gehele getallen 1 tot en met 10 . weer. Schrijf een rhs-commando zo dat lhs | rhs is gelijk aan 10864213579 alleen met tac (Hint: zie Tac voor voorbeeld van optie)
2. Keer de uitvoer van rhs() om find -mindepth 1 -maxdepth 1 -print0 ; met tac (Hint: zie voorbeeld van de optie Tac-scheidingsteken)
3. Taak verlengen.sh (in Tac-commando in pure bash) om zich precies als tac te gedragen. U moet opties toevoegen en ervoor zorgen dat u hun gedrag test.
4. Implementeer een primitieve versie van tac in pure bash als een recursieve functie.

TL;DR

Nogmaals, ik vond het leuk om het Bash tac-commando te schrijven. Na het lezen hoop ik dat je het ermee eens bent dat er meer aan de hand is dan je dacht. Ook, na te hebben geprobeerd dingen op de moeilijke manier aan de onderkant te doen, hoop ik dat je weet hoe nuttig het tac-commando zou kunnen zijn. Als iemand erin slaagt een van de oefeningen te voltooien of hulp nodig heeft bij zijn huiswerk, laat het me dan weten. Bedankt,

Strijd om Wesnoth Zelfstudie
The Battle for Wesnoth is een van de meest populaire open source strategiespellen die je op dit moment kunt spelen. Dit spel is niet alleen al heel la...
0 A.D. zelfstudie
Van de vele strategiespellen die er zijn, 0 A.D. slaagt erin om op te vallen als een uitgebreide titel en een zeer diep, tactisch spel ondanks dat het...
Unity3D-zelfstudie
Inleiding tot Unity 3D Unity 3D is een krachtige game-ontwikkelingsengine. Het is platformoverschrijdend, zodat je games voor mobiel, internet, deskto...