Linux-kommandot `rev` manipulerar textsträngar genom att vända dem. Detta verktyg kan operera på både direkt angiven text och filer, vilket kan verka oerhört simpelt. Dock, likt många kommandoradsverktyg, avslöjas dess verkliga potential när det kombineras med andra kommandon.
Kommandot `rev` tillhör den kategori av enkla Linux-verktyg som vid första anblick kan kännas en aning udda. Dess kärnfunktion är att spegelvända textsträngar. Förutom att kunna presentera en snabb hjälpsida med `-h` och visa versionsnumret med `-V`, tar det inte emot några ytterligare kommandoradsargument.
Så, `rev` vänder text, inget mer? Inga varianter eller andra möjligheter? Svaret är både ja och nej. Ja, det saknar andra funktioner, men nej, det är absolut inte hela bilden. Denna genomgång demonstrerar hur du kan sammanfoga `rev` för att utföra effektiva operationer.
När `rev` används som byggsten i mer komplexa kommando-sekvenser, blir dess värde uppenbart. `rev` är en av flera kommandon (som `tac` och `yes`) som agerar som underlättare. Deras nytta blir tydligare när man ser hur de förbättrar effektiviteten hos andra kommandon.
Användning av kommandot `rev`
Om `rev` används utan extra parametrar, tar det emot inmatning, spegelvänder den och visar resultatet i terminalfönstret. Detta fortgår tills du avbryter med Ctrl+C.
rev
Om du skriver in text och trycker på Enter, kommer `rev` att skriva ut strängen omvänd – om du inte matar in ett palindrom, förstås.
Mata in text till `rev`
Du kan skicka text till `rev` med hjälp av `echo`.
echo one two three | rev
Du kan även använda `rev` för att vända innehållet i en hel textfil, rad för rad. I detta exempel används en fil som innehåller en lista över filnamn. Filen heter ”filelist.txt”.
rev filelist.txt
Varje rad läses från filen, vänds och visas sedan i terminalfönstret.
Kombinera `rev` med andra kommandon
Här är ett exempel som använder pipe för att anropa `rev` två gånger.
Detta kommando tar bort det sista tecknet från en textsträng. Detta kan vara praktiskt för att avlägsna skiljetecken. Vi använder kommandot `cut` för att klippa ut tecknet.
echo 'Remove punctuation.' | rev | cut -c 2- | rev
Låt oss gå igenom det:
`echo` skickar strängen till det första anropet av `rev`.
`rev` vänder strängen och skickar den vidare till `cut`.
Flaggan `-c` (tecken) instruerar `cut` att returnera en sekvens av tecken från strängen.
Optionen `2-` säger till `cut` att returnera tecken från position två till slutet av raden. Om ett andra nummer angivits, som exempelvis `2-5`, skulle intervallet vara från tecken två till fem. Utan ett andra nummer avses ”till slutet av strängen”.
Den omvända strängen – utan dess första tecken – skickas till `rev`, som återställer ordningen till den ursprungliga.
Eftersom vi tog bort det första tecknet i den vända strängen, har vi därmed tagit bort det sista tecknet i den ursprungliga strängen. Visst, detta kan uppnås med `sed` eller `awk`, men här är syntaxen enklare.
Extrahera det sista ordet
Vi kan använda en liknande metod för att få ut det sista ordet på en rad.
Kommandot liknar det föregående, med `rev` använd två gånger. Skillnaden ligger i hur kommandot `cut` används för att selektera delar av texten.
echo 'Separate the last word' | rev | cut -d' ' -f1 | rev
Här är kommandots uppbyggnad:
`echo` skickar strängen till det första anropet av `rev`.
`rev` vänder strängen och pipe:ar den till `cut`.
Flaggan `-d’ ’` (avgränsare) instruerar `cut` att returnera en sekvens av tecken avgränsade med ett blanksteg.
Flaggan `-f1` anger att `cut` ska returnera den första delen av strängen som inte innehåller avgränsaren. Med andra ord, den första delen av meningen upp till första blanksteget.
Det omvända första ordet skickas till `rev`, vilket återställer ordningen till den ursprungliga.
Eftersom vi extraherade det första ordet i den vända strängen, har vi tagit ut det sista ordet i den ursprungliga strängen. Det sista ordet i meningen var ”word” och det skrivs ut.
Ta bort innehåll från filer
Låt oss anta att vi har en fil som innehåller en lista över filnamn och att filnamnen är omgivna av citationstecken. Vi vill ta bort citationstecknen från filnamnen.
Vi ser filens innehåll:
less filelist.txt
Filens innehåll visas i less.
Vi kan ta bort skiljetecken från båda ändarna av varje rad med följande kommando. Detta kommando nyttjar både `rev` och `cut` två gånger.
rev filelist.txt | cut -c 2- | rev | cut -c 2-
Filnamnen listas utan citationstecken.
Kommandot kan förklaras så här:
`rev` vänder raderna i filen och skickar dem vidare till `cut`.
Flaggan `-c` (tecken) instruerar `cut` att returnera en sekvens av tecken från varje rad.
Optionen `2-` säger till `cut` att returnera teckenintervallet från tecken två till slutet av varje rad.
De omvända strängarna, minus deras första tecken, skickas till `rev`.
`rev` vänder strängarna, så de återgår till sin ursprungliga ordning. De skickas vidare till `cut` en andra gång.
Flaggan `-c` (tecken) instruerar `cut` att returnera en sekvens av tecken från varje sträng.
Optionen `2-` instruerar `cut` att returnera intervallet från tecken två till slutet av varje rad. Detta ”hoppar över” det inledande citationstecknet, som är tecken ett på varje rad.
Många pipes
Här är ett kommando som returnerar en sorterad lista över alla filändelser i den aktuella katalogen. Det använder fem distinkta Linux-kommandon.
ls | rev | cut -d'.' -f1 | rev | sort | uniq
Processen är enkel:
`ls` listar filerna i den aktuella katalogen. Dessa skickas till `rev`.
`rev` vänder filnamnen och skickar dem vidare till `cut`.
`cut` returnerar den första delen av varje filnamn upp till en avgränsare. Flaggan `-d’.’` instruerar `cut` att använda punkten `.` som avgränsare. Den del av de vända filnamnen som kommer fram till första punkten är filändelserna. Dessa skickas till `rev`.
`rev` återställer ordningen på filändelserna. De skickas till `sort`.
`sort` sorterar filändelserna och resultatet skickas vidare till `uniq`.
`uniq` ger en unik lista för varje filändelse. Notera att om ingen filändelse finns (som för makefile och katalogerna Help och gc_help), listas hela filnamnet.
För att lägga till en extra funktion, lägg till kommandoradsargumentet `-c` (count) till kommandot `uniq`.
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c
Nu erhåller vi en sorterad lista över de olika filtyperna i aktuell katalog tillsammans med antalet av varje.
Det är en ganska imponerande enradare!
Framåt och Bakåt
Ibland måste man gå bakåt för att komma framåt. Och du går oftast snabbast framåt som en del av ett team.
Lägg till `rev` i din verktygslåda, och du kommer snart att använda det för att förenkla annars komplexa kommandon.