Hur man berättar om en bashsträng innehåller en delsträng på Linux

0
122
fatmawati achmad zaenuri/Shutterstock.com

I Linux-skript vill du ibland veta om en textsträng innehåller en specifik, mindre sträng. Det finns många sätt att göra detta. Vi visar dig några enkla, pålitliga tekniker.

Varför är detta användbart?

Att söka i en sträng efter en mindre delsträng är ett vanligt krav. Ett exempel skulle vara att läsa text från en fil eller från mänsklig input och söka i strängen efter en specifik delsträng så att ditt skript kan bestämma vad som ska göras härnäst. Det kanske letar efter en etikett eller enhetsnamn i en konfigurationsfil eller en kommandosträng i en rad med indata från en användare.

Linux-användare är välsignade med valfritt antal verktyg för att manipulera text. Vissa är inbyggda i Bash-skalet, andra tillhandahålls som fristående verktyg eller applikationer. Det finns en anledning till att Unix-härledda operativsystem serveras rikt med strängmanipuleringsmöjligheter.

RELATERATHur man manipulerar strängar i Bash på Linux

Vissa saker som verkar vara filer är inte enkla filer. De är speciella filer som representerar saker som hårdvaruenheter och källor till systeminformation. Abstraktionen som utförs av operativsystemet ger dem utseendet och egenskaperna hos filer. Du kan läsa information från dem—som text, naturligtvis—och i vissa fall skriva till dem, men de är inte vanliga filer.

Text används också som in- och utdata för kommandon i ett terminalfönster. Detta möjliggör omdirigering och rörledning av in- och utdata. Den funktionen underbygger förmågan att kedja ihop sekvenser av Linux-kommandon och överföra utdata från ett kommando som indata till nästa.

Oavsett dess ursprung är sökningen i texten vi får efter ett betydelsefullt ord, kommando, etikett eller någon annan indikator en standarddel av att hantera textbaserad data. Här är en samling enkla tekniker som du kan inkludera i dina egna skript.

Hitta delsträngar med Bash Builtins

De dubbla parenteserna “[[…]]” strängjämförelsetest kan användas i  if-satser för att avgöra om en sträng innehåller en annan sträng.

Kopiera det här skriptet till en redigerare och spara det i en fil som heter “double.sh.”

#!/bin/bash if [[ “monkey” = *”key”* ]] ; sedan   echo “nyckeln är i apan” annars   echo “nyckeln är inte i apan” fi RELATERATHur man använder villkorliga tester med dubbla fästen i Linux

Du måste göra skriptet körbart med kommandot chmod. Detta är ett steg som alltid krävs för att göra alla skript körbara. Du måste göra detta varje gång du skapar en skriptfil. Byt ut namnet på lämpligt skript i varje fall.

chmod +x double.sh

< /p>

Låt oss köra skriptet.

./double.sh

Detta fungerar eftersom asterisken ” * ” representerar vilken sekvens av tecken som helst, inklusive inga tecken. Om delsträngen “nyckel” är placerad inom målsträngen, med eller utan några tecken framför eller bakom den, kommer testet att returnera sant.

I vårt exempel finns det tecken framför delsträngen. Dessa matchas av den första asterisken. Det finns inga bokstäver bakom delsträngen men eftersom en asterisk inte heller matchar några tecken, går testet fortfarande godkänt.

För flexibiliteten kan vi modifiera vårt skript för att hantera variabler istället för bokstavliga strängar. Det här är skriptet “double2.sh.”

#!/bin/bash string=”Monkey” substring=”key” if [[ $string = *$substring* ]]; sedan echo “$substring hittades i $string” annars eko “$substring hittades inte i $string” fi

Låt oss se hur det går.

./double2.sh

< img src="http://www.howtogeek.com/pagespeed_static/1.JiBnMqyl6S.gif" />

Detta fungerar på samma sätt, med fördelen att vi kan använda variabelnamn istället för bokstavliga strängar. Att förvandla vår lilla lösning till en funktion ger den största flexibiliteten.

Detta är skriptet “double3.sh.”

#!/bin/bash shopt -s nocasematch string=”Monkey” substring=”Key” capital=”London” check_substring () { if [ [$1 = *$2*]]; sedan echo “$2 hittades i $1” annars echo “$2 hittades inte i $1” fi } check_substring “Apa” “nyckel” check_substring $string $substring check_substring $string “banana” check_substring “Wales” $capital

Vi kallar vår check_substring-funktion med en blandning av variabler och bokstavliga strängar. Vi använde shopt med dess -s (set)-alternativ för att ställa in nocasematch, för att göra matchningarna skiftlägesokänsliga.

Så här fungerar det.

./double3.sh

Vi kan också använda tricket att linda in delsträngen i asterisker i case-satser. Det här är “case.sh.”

#!/bin/bash shopt -s nocasematch string=”Wallaby” substring=”Wall” case $string in *$substring*) echo “$ delsträng hittades i $string” ;; *) echo “Inget matchade: $string” ;; esac

Att använda fallsatser istället för mycket långa if-satser kan göra skript lättare att läsa och felsöka. Om du behövde kontrollera om en sträng innehöll en av många möjliga delsträngar, skulle fallsatsen vara det bästa valet.

./case.sh

Delsträngen hittas.

Hitta delsträngar med grep

< p>Utöver de inbyggda Bash-programmen är det första textsökningsverktyget du förmodligen kommer att nå grep. Vi kan använda greps medfödda förmåga att söka efter en sträng i en sträng för att leta efter våra delsträngar.

Detta skript kallas “subgrep.sh.”

#!/bin/bash string=”grötgryta” substring=”ridge” if $(echo $string | grep -q $substring); sedan echo “$substring hittades i $string” annars eko “$substring hittades inte i $string” fi

Skriptet använder eko för att skicka strängen till grep, som söker efter understrängen. Vi använder alternativet -q (tyst) för att stoppa grep från att skriva något till standardutdata.

RELATEDHur man använder kommandot grep på Linux

Om resultatet av kommandona inom parentesen “(…)” är lika med noll betyder det att en matchning hittades. Eftersom noll är lika med sant i Bash, är if-satsen uppfylld och then-satsen exekveras.

Låt oss se vad dess utdata är.

./subgrep.sh

Hitta delsträngar med sed

Vi kan också använda sed för att hitta en delsträng.

Som standard skriver sed ut all text som matas in i den. Att använda sed -n förhindrar detta. De enda raderna som skrivs ut är matchande linjer. Detta uttryck kommer att skriva ut alla rader som matchar eller innehåller värdet för $substring.

“/$substring/p”

Vi matar in värdet på $string i sed med hjälp av en omdirigering här, <<<. Detta används för att omdirigera värden till ett kommando i det aktuella skalet. Den anropar inte ett underskal på det sätt som ett rör skulle göra.

RELATERATHur man använder sed-kommandot på Linux

Det första -n är testet. Det kommer att returnera sant om utdata från sed-kommandot är icke-noll. Det enda sättet som utdata från sed kan vara icke-noll är om en matchande linje hittades. Om så är fallet måste $substring ha hittats i $string.

Detta är “subsed.sh.”

#!/bin/bash string=”Sverige” substring=”eden” if [ -n “$(sed -n “/$substring/p” <<< $string)” ]; sedan echo “$substring hittades i $string” annars echo “$substring hittades inte i $string” fi

Vi får det förväntade svaret när vi kör skriptet.

./subsed.sh

Vi kan testa logiken i skriptet genom att redigera värdet på $substring så att jämförelsen misslyckas.

./subsed.sh

Sluta söka, hittade det

Andra verktyg kan hitta delsträngar, till exempel awk och Perl men ett enkelt användningsfall som att hitta en delsträng garanterar inte deras extra funktionalitet eller den extra komplexiteten. I synnerhet är det snabbt, enkelt att använda de inbyggda Bash-programmen för att söka efter delsträngar och kräver inga externa verktyg.

RELATERAT: Hur man använder fallutlåtanden i Bash-skript

LÄS NÄSTA

  • › Hur man stänger av iPhone 14 Pros alltid-på-skärm
  • › Så här använder du en Microsoft-mall för din Outlook-signatur
  • › Gigabytes nya bildskärm är för båda dina stationära datorer
  • › 10 Steam-funktioner du bör använda
  • › Hur man bäst placerar en luftrenare
  • › Använda ett Wi-Fi gästnätverk? Kontrollera dessa inställningar