Sida 1 av 1
bash läsa rad k
Postat: 21 april 2025, 23:30:17
av Oltronix
Jag vill få tag i sista sparade data i en rrd-databas.
Hur läser man den k:te raden i data som nedan?
Kod: Markera allt
rrdtool dump database6.rrd | grep last_ds
<last_ds>U</last_ds>
<last_ds>U</last_ds>
<last_ds>6.4</last_ds>
<last_ds>10.2</last_ds>
<last_ds>U</last_ds>
<last_ds>U</last_ds>
Jag vill komma åt data raden med "10.2"
Så här långt kom jag med lite olika bash-kommandon o pipe
Jag kan förståss skriva raderna till en fil och läsa tillbaks raderna och skippa de första 3 men jag tänkte att det borde gå att fixa i bash utan någon extra fil. Jag testat awk och kom ingenstans. sed har ja inte testat.
ps
med
Kod: Markera allt
rrdtool info database6.rrd | grep basement| grep last_ds| awk '{print $3}'| tr \" " "| cut -c 2-5
fungerade det, men den orginala fråga är fortfarande intressant
Re: bash läsa rad k
Postat: 22 april 2025, 02:26:18
av Glenn
Finns väl en miljon sätt att göra det på, men ett enkelt men kanske lite trubbigt sätt om det alltid är samma rad är ju att använda head och tail, typ
| head -n4 | tail -n1
..Sen plocka ut fältet med sed, awk eller cut som du gjorde typ.
Re: bash läsa rad k
Postat: 22 april 2025, 08:26:43
av Bo.Siltberg
gawk 'NR == 4 && match($0, "<last_ds>[^<]+</last_ds>", a) { print a[1] }
(ej testat)
Re: bash läsa rad k
Postat: 22 april 2025, 09:35:26
av Oltronix
Snyggt att boxa in på detta sätt. Sedan får det var hur trubbigt som helst ...
som svar till Glenn
ps
Bos förslag fungerande inte direkt måste skruva lite på det. Kan bero på att jag inte har gawk utan bara awk
Re: bash läsa rad k
Postat: 23 april 2025, 18:59:59
av farbrorvattenmelon
Jag är inte insatt i hur grep och övriga kommandon används korrekt, men har provat fram dessa i regex101.com:
Denna Regex? (kräver att global-flagga "g" är off annars kan flera träffar ges). Sökt värde hamnar i
capture group 1 men matchningen returnerar hela fyra första posterna.
Kod: Markera allt
(?:<last_ds>.*<\/last_ds>\s*){3}<last_ds>(.*)<\/last_ds>
regex.png
regex2.png
EDIT: Om varje rad garanteras innehålla välformad data och "<" samt ">" inte är en del av dataposterna borde denna funka, samma här med global flagga: ska vara off och värdet hamnar i capture group 1.
Ännu en variant som kräver välformad data, med g satt till on fås match på varje rad och resultatet finns att hämta i match 4: group 1.
Re: bash läsa rad k
Postat: 25 april 2025, 11:33:00
av toolbox
sed är nog enklast att använda och då behövs bara ett verktyg. Att printa 4:e raden gör man med
Sedan, vill man ha ut bara värdet kan man börja med att städa upp raden och ta bort <....> och då blir kommandot två städningar och en print:
Kod: Markera allt
sed -e 's/<last_ds>//' -e 's/<\/last_ds>//' -ne 4p
Re: bash läsa rad k
Postat: 15 maj 2025, 07:56:44
av Oltronix
Ja det finns många olika metoder. Bra att kunna variera sig. Jag kom ihåg VMS/DSL.Vi kallade det fnuttelogik och tyckte att det var helt absurd syntax men sed o regulära uttryck har väl knappast mindre absurd syntax. Dock vänjer man sig om man använder det ofta,