bash läsa rad k

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Oltronix
Inlägg: 446
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

bash läsa rad k

Inlägg 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

Kod: Markera allt

U /l
U /l
6.4 
10.2 
U /l
U /l
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
Användarvisningsbild
Glenn
Inlägg: 36169
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: bash läsa rad k

Inlägg 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.
Bo.Siltberg
Inlägg: 382
Blev medlem: 30 juli 2018, 06:46:13

Re: bash läsa rad k

Inlägg av Bo.Siltberg »

gawk 'NR == 4 && match($0, "<last_ds>[^<]+</last_ds>", a) { print a[1] }

(ej testat)
Användarvisningsbild
Oltronix
Inlägg: 446
Blev medlem: 10 december 2011, 21:24:38
Ort: Nynäs

Re: bash läsa rad k

Inlägg 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
Användarvisningsbild
farbrorvattenmelon
Inlägg: 282
Blev medlem: 29 januari 2009, 21:38:21

Re: bash läsa rad k

Inlägg 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.

Kod: Markera allt

(?:.*\s){3}.*>(.*)<
Ä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.

Kod: Markera allt

>(.+)<
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

Re: bash läsa rad k

Inlägg 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

Kod: Markera allt

sed -ne 4p
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
Skriv svar