Regex hjälp… hitta poster...

Tråden skapades och har fått 14 svar. Det senaste inlägget skrevs .
1

Jag behöver hjälp med att hitta vissa rader i ett lååååångt dokument.
Det innehåller en massa produktnummer i formen
R23T12A12

Jag behöver kunna hitta t.ex.
Alla rader med R01T01A[0-9][0-9]
Eller alla rader med R[0-9][0-9]T01A[0-9][0-9]

Kör det ett varv genom perl -nle 'print if /^R01T01A[0-9][0-9]$/', eller det mönster du vill filtrera på.

Tack!
Men varför tvingar de mig använda bash… kanske någon kan fixa detta…
Detta scripta kommer anropas av ett antal gånger per dag… så perl nja.

if [ "$1" =~ '/^R[0-9][0-9]T[0-9][0-9]-A[0-9][0-9]$/' ] ; then 
	exit 0;
else
	exit 1;
fi

$1 är raden som jag ska kolla.
Detta resulterar exit 1.
Exit är bara satt för test.

  • Skribent
  • Sollentuna
  • 2013-08-14 09:45

De mönster du anger är korrekta regexpar som förmodligen gör det du förväntar dig. Är det själva verktygen du behöver hjälp med? I så fall, vilken miljö gäller det? Terminalen, i nån applikation eller i programkod?

För terminalen bör det funka med

egrep "R[0-9]{2}T01A[0-9]{2}" longfile.txt

{2} anger att det föregående uttrycket ska upprepas två gånger, vilket är lite mer generellt och anpassningsbart än att skriva uttrycket två gånger.

Edit: Lite långsam tydligen..

Nu skiljer sig syntaxen lite beroende på vilken motor du använder, och det går inte att riktigt förstå mönstret du är ute efter utifrån dina exempel, men om jag gissar rätt är antalet tecken konstant och likaså alla bokstäver, det är bara siffrorna som kan variera.

I så fall är det typ:

R[0-9]{2}T[0-9]{2}A[0-9]{2}

sen är det frågan om du vill ha ut bara numren, eller om du vill ha hela raden där dessa nummer förekommer, och slutligen om det mönstret kan förekomma någonstans där det INTE är ett produktnummer, dvs. att man måste kvalificera frågan ytterligare.

Vad vill du sen göra med numren, ska du bara få fram dem eller vill du ersätta/manipulera dem också ?

Richard… tack jag ska förklara.
Jag behöver ett script, terminal-script (bash) som kollar en loggfil som lever, när den hittar en rad som innehåller R[0-9]{2}T[0-9]{2}A[0-9]{2} så ska HELA raden plockas ut och matas in i en databas.

Räcker det? Jag hoppas det.

  • Skribent
  • Sollentuna
  • 2013-08-14 10:10
Ursprungligen av Mattias Hedman:

Richard… tack jag ska förklara.
Jag behöver ett script, terminal-script (bash) som kollar en loggfil som lever, när den hittar en rad som innehåller R[0-9]{2}T[0-9]{2}A[0-9]{2} så ska HELA raden plockas ut och matas in i en databas.

Räcker det? Jag hoppas det.

Ska hela filen kollas igenom regelbundet i långa intervall, eller ska den kollas ofta/kontinuerligt? Är det nån speciell anledning till att du måste göra det i Bash, eller räcker det med att det är körbart från en Bash-prompt?

ofta/kontinuerligt är det som gäller.
Systemet finns på en *nix server och jag är mest van med Bash.
Så ett script är ett måste.

  • Medlem
  • Sollentuna
  • 2013-08-14 10:33

Men du vill ju egentligen bara kolla varje nytillkommen rad för samma sökbegrepp, eller hur? Att kolla gamla rader måste väl anses som meningslöst då dom inte har ändrat på sig sedan förra gången. Så något tail(1)-aktigt eller liknande vill du väl köra? Med andra ord - den sista delen = sista raden helt enkelt.

Du ska helt enkelt göra det händelsestyrt (event driven) då du inte vet hur ofta och när du får ny data att jobba på. Denna lösning gör att du inte slösar med resurserna, men ändå gör det enkelt och snyggt. Eldar inte för kråkorna, som vi i branschen säger...

Alldeles rätt @Frazze.

Ursprungligen av Mattias Hedman:

Jag behöver hjälp med att hitta vissa rader i ett lååååångt dokument.
Det innehåller en massa produktnummer i formen
R23T12A12

Jag behöver kunna hitta t.ex.
Alla rader med R01T01A[0-9][0-9]
Eller alla rader med R[0-9][0-9]T01A[0-9][0-9]

Om du gör så här:

#!/bin/bash
while read input; do
        if [[ "$input" =~ ^R[0-9]{2}T[0-9]{2}A[0-9]{2} ]]; then
                echo "$input"
        fi
done

Och sparar den i en fil som vi kan låta heta filter.sh
Så kan du köra typ tail -f loggfil | ./filter.sh och låta den gå kontinuerligt. Outputen från filter.sh kan du ju pipea vidare in i databasprogrammet eller skriva till fil eller nåt...

Dubbelgilla!
Ska testa det på en gång.

Men toppen nu förändras förutsättningarna… vafan.
Jag kommer få en variabel som innehåller en rad, den ska jag kolla med mitt regel som den möter formatteringen jag nämnt.

Jag har testat att ändra allt till

if [[ "$rad" =~ ^R[0-9]{2}T[0-9]{2}A[0-9]{2} ]]; then
                exit 0
else
                exit 1
fi

men en så länge funkar det inte, måste kolla loggfilen om jag får några tips där.

Och nu är det som kommer in annorlunda.
Produkt.namn.R01T23A22

Ursprungligen av Mattias Hedman:

Men toppen nu förändras förutsättningarna… vafan.
Jag kommer få en variabel som innehåller en rad, den ska jag kolla med mitt regel som den möter formatteringen jag nämnt.

Jag har testat att ändra allt till

if [[ "$rad" =~ ^R[0-9]{2}T[0-9]{2}A[0-9]{2} ]]; then
                exit 0
else
                exit 1
fi

men en så länge funkar det inte, måste kolla loggfilen om jag får några tips där.

Och nu är det som kommer in annorlunda.
Produkt.namn.R01T23A22

Fimpa ^ och lägg ett $ i slutet (R[0-9]{2}T[0-9]{2}A[0-9]{2}$)?

Ursprungligen av suddgummi:

Fimpa ^ och lägg ett $ i slutet (R[0-9]{2}T[0-9]{2}A[0-9]{2}$)?

Nu funkar det. Tack! De lär väl ändra en gång till men nu funkar det.

1
Bevaka tråden