C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Oltronix
Inlägg: 446 Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs
Inlägg
av Oltronix » 21 april 2025, 23:30:17
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
Glenn
Inlägg: 36169 Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:
Inlägg
av Glenn » 22 april 2025, 02:26:18
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.
Bo.Siltberg
Inlägg: 382 Blev medlem: 30 juli 2018, 06:46:13
Inlägg
av Bo.Siltberg » 22 april 2025, 08:26:43
gawk 'NR == 4 && match($0, "<last_ds>[^<]+</last_ds>", a) { print a[1] }
(ej testat)
Oltronix
Inlägg: 446 Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs
Inlägg
av Oltronix » 22 april 2025, 09:35:26
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
farbrorvattenmelon
Inlägg: 282 Blev medlem: 29 januari 2009, 21:38:21
Inlägg
av farbrorvattenmelon » 23 april 2025, 18:59:59
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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
toolbox
Inlägg: 21 Blev medlem: 20 november 2021, 20:56:32
Inlägg
av toolbox » 25 april 2025, 11:33:00
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