Även känd som omvänd katt, tac ett enkelt kommandoradsverktyg som låter dig omvända linjer i utdata med | inbyggd röroperatör och tac. Det vill säga om du har ett kommando, vänster sida (lhs) och vill vända innehållet i dess utdata, är allt du skulle göra att skriva lhs | tac. Det är allt!
Visserligen finns det mer att tac än vad som syns. Oroa dig inte. Vi täcker allt i god tid.
Råd om tac
Att använda eller inte använda, det är frågan. Du vill inte att du inte vill tac när du inte behöver. Men om du vill sprida tac som ditt bröd- och smörkommando är det upp till dig. Under tiden, här är mitt råd om att ta båda sidor för att förbli lika neutrala.
När ska man använda tac
Det finns tillfällen när du använder tac som hjälper dig att få ut mer på kommandoraden med mindre kod och tid på att undersöka lhs kommandealternativ.
När du inte är säker på alternativen för lhs
Många kommandon som sort kommer med ett alternativ för att vända utdata från ett kommando. Om du inte är säker på om ett kommando på vänster sida har ett -r-alternativ för att omvända utdata, är tac ett säkert sätt att omvända utgångslinjerna.
När prestanda inte spelar någon roll
Även om det är obetydligt, fungerar de flesta kommandon som används tillsammans med ett inbyggt alternativ för att backa utdata bättre än att pipa utgången till tac. Så om en liten prestationsfördröjning inte är ett problem, är det okej att pipa i tac för att spela upp utdata i omvänd ordning.
När man inte ska använda tac
Det finns tillfällen när du kanske inte använder tac eftersom du vet bättre. Här är några att notera.
När du vet har kommandot på lhs möjlighet att vända utgångslinjer
Som jag sa, ”De flesta kommandon har ett alternativ att omvända utdata.”Om du vet att ett specifikt lhs-kommando har ett alternativ kan du inte använda tac. När allt kommer omkring är -r kortare än - | tac.
När prestanda betyder något
Som jag sa, “Att använda alternativet omvänd lhs kan fungera bättre än tac.”Om du vill pressa ut några sekunder i ett bash-skript eller har att göra med större filer som kräver tid att läsa kan du inte använda tac.
Tac hjälp
Att köra hjälpkommandot för tac eller man tac visar användningen tillsammans med alternativ som kan användas. Här är vad du kan förvänta dig.
Kommandon
tac --hjälpProduktion
Tac-version
Vilken version är jag?
Du är den senaste versionen av dig själv. Men när det gäller vilken version din tac är, finns det ett alternativ för det.
Kommandon
tac --versionProduktion
Anteckningar
Om du använder tac på FreeBSD eller macOS kanske det långa alternativet för version inte är tillgängligt. I så fall försök -v eller man tac. Låt mig veta om du har provat det. Jag är nyfiken. Tack
Tac-alternativ
Förutom hjälp och version har tac inte många alternativ. För vad den har är du säker på att ta reda på att tac inte bara är någon gammal omvänd katt.
Tac före alternativet
Med alternativet -b kan du ändra hur separatorn är ansluten till utdata. Som standard är den nya linjeseparatorn bifogad efter varje rad.
Jag vet att det är förvirrande. Låt oss bryta ner det med exempel.
Låt oss först se hur vår produktion ser ut innan vi använder tac -b.
Kommandon
seq 10Produktion
Låt oss nu se vad vår produktion blir till efter att ha använt tac utan -b.
Kommandon
seq 10 | tacProduktion
Låt oss nu se vad utgången blir till med tac -b.
Kommandon
seq 10 | tac -bProduktion
Tac separator alternativ
Avgränsningsalternativet -s "bokstavlig sträng" låter dig ange tecken eller sekvens av tecken som används av tac för att skilja mellan rader. Som standard används den nya linjetecknet ('0a' i hex).
Hur man använder tac-separatoralternativet är inte självklart först. Men när du väl vet att den är där är det svårt att inte försöka använda den.
Tänk på följande exempel, som fungerar på linjer representerade i hex.
Kommandon
sek 20 | xxd -ps | tac -s '0a' | xxd -ps -rProduktion
Anteckningar
(1) Det kan verka trivialt som att använda sekvensen 20 | tac-kommandot, men i så fall spenderade vi inte tid på att arbeta med utdataströmmen i hex. Att använda detta mönster är användbart när separata inte är något trivialt som den nya linjetecknet som nollbyte.
Försök nu mindre använda tac på något lite mindre rå och mer meta som enkel HTML.
Tänk på följande fil.
Fil
AB
C
Kommandon
fil () echo -e "AB
C
";
fil | tac -s "
"
Produktion
Vi lyckades konvertera HTML-sidan
AB
C
in i
CB
A
med tac.
Antag att du behöver göra något lite mer komplicerat som att behandla alla taggar som en tac-separator. I så fall kommer du inte att komma undan med att bara använda separatoralternativet ensam. Det är där regex-alternativet kommer in. I kombination med separatoralternativet gör det att du kan göra mer med tac-kommandot än att vända en rad i en fil. Här är hur.
Tac regex-alternativ
Regex-alternativet -r -s 'regex' låter dig ange att separatorsträngen ska behandlas som ett reguljärt uttryck.
Hur man använder tac regex-alternativet är så enkelt som att lägga till -r-alternativet före eller efter separatorn.
Tänk på föregående exempel med hjälp av regex-alternativet i kombination med separatoralternativet. Låt oss tac behandla valfri markeringstagg som en separator.
Fil
enkla funktioner
Funktionerna är enkla i bash. Åtminstone den här är. Det sätter en sträng på skärmen.
Kommandon
enkel funktion
()
eko
så enkelt som det blir enkel funktion
Källa: https: // temptemp3.github.io / bash-funktioner
Kommandon
fil ()eko '
enkla funktioner
Funktionerna är enkla i bash. Åtminstone den här är. Det sätter en
sträng på skärmen.
Kommandon
enkel funktion
()
eko så enkelt som det blir
enkel funktion
fil | tac -r -s "] *."
Produktion
Vi lyckades konvertera HTML-sidan och vända filen med HTML-taggar. Om du tittar på detaljerna kommer du att märka att den inte är perfekt än.
Tac-kommando i ren bash
Här är en primitiv version av tac-implement i ren bash som vänder linjerna som rörs in av ett lhs-kommando. Framtida versioner är kvar som en övning.
#!/ bin / bash## tac
## version 0.0.1 - initial
################################################################
tac ()
lokal-en arr
lokal -i i
kartfil arr -
i = "$ # arr [@]"
medan [$ i -ge 0]
do
eko $ arr [i]
låt i- = 1
Gjort
################################################################
tac
################################################################
Källa: https: // github.com / temptemp3 / ba.sh / blob / master / tac.sh
Tac-kommando med andra kommandon
Här är några primitiva versioner av tac-implement med andra kommandon som omvandlar linjerna som rörs in med ett lhs-kommando. Framtida versioner är kvar som en övning.
Innan vi börjar, stäng ögonen och tänk, ”Vad kan användas för att implementera en primitiv version av tac?”
Många kommandon kommer att tänka på men jag kommer att fokusera på de som vi har utrymme för.
gawk
Liknar Tac-kommandot i rent bash-exempel, för att implementera tac skulle vi först lagra de läsrader som ska spelas om i omvänd ordning efter att alla rader har lästs. Så här ser det ut med gawk.
gawk 'line [++ line [0]] = $ (0) END för (i = 0; i
Försök nu använda kommandot lhs seq 10.
seq 10 | gawk 'line [++ line [0]] = $ (0) END för (i = 0; i
Som du förväntar dig är produktionen
Övningar
1. Funktionen lhs () seq 10; listar heltal 1 till 10. Skriv ut ett rhs-kommando så att lhs | rhs är lika med 10864213579 endast med tac (Tips: se Tac före alternativsexempel)
2. Omvänd utdata från rhs () hitta -mindepth 1 -maxdepth 1 -print0; med tac (Tips: se exempel på Tac-separatoralternativ)
3. Förläng tac.sh (i Tac-kommandot i ren bash) för att bete sig precis som tac. Du måste lägga till alternativ och se till att testa deras beteende.
4. Implementera en primitiv version av tac i ren bash som en rekursiv funktion.
TL; DR
Återigen tyckte jag om att skriva Bash tac-kommandot. Efter att ha läst hoppas jag att du kan komma överens om att det finns mer att tac än du trodde. Efter att ha försökt göra saker på det hårda sättet nära botten hoppas jag också att du vet hur användbart tac-kommandot kan vara. Om någon lyckas slutföra någon av övningarna eller behöver hjälp med sina läxor, låt mig veta. Tack,