Sed - radera antal rader i förhållade till nyckelord?

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
PyroClastic
Inlägg: 12
Blev medlem: 29 okt 2010, 16:28
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Sed - radera antal rader i förhållade till nyckelord?

Inlägg av PyroClastic »

Hejsan! Ursäkta om rubriken är lite vimsig, men jag vet inte om jag kan sammanfatta det tydligare. Jag undrar om det med sed går att radera ett visst antal rader innan eller efter ett nyckelord. Exempelvis om jag i den här loggen vill rensa bort alla lyckade nedladdningar och spara 4 rader innan nyckelodet "FEL" så jag ser vilka filer som misslyckats.

Kod: Markera allt

--2011-01-11 22:58:05--  http://t0.gstatic.com/images?q=tbn:ANd9GcSfB9UDN74eu1dnHY-fqACQpgYNUIxvAKH-nRKWCRmqNcPHMfZVIQ
Slår upp t0.gstatic.com... 66.102.13.147, 66.102.13.99, 66.102.13.103, ...
Ansluter till t0.gstatic.com|66.102.13.147|:80... ansluten.
HTTP-begäran skickad, väntar på svar... 200 OK
Längd: 5982 (5,8K) [image/jpeg]
Sparar till: "images?q=tbn:ANd9GcSfB9UDN74eu1dnHY-fqACQpgYNUIxvAKH-nRKWCRmqNcPHMfZVIQ"

     0K .....                                                 100%  159K=0,04s

2011-01-11 22:58:05 (159 KB/s) - "images?q=tbn:ANd9GcSfB9UDN74eu1dnHY-fqACQpgYNUIxvAKH-nRKWCRmqNcPHMfZVIQ" sparades [5982/5982]

--2011-01-11 22:58:05--  http://t0.gstatic.com/images?q=tbn:ANd9GcQstO11s7xqQ3m7JCapEAkdZ4hNZoUgWVuxG6etQQeUwDaVdRQG
Återanvänder befintlig anslutning till t0.gstatic.com:80.
HTTP-begäran skickad, väntar på svar... 200 OK
Längd: 10838 (11K) [image/jpeg]
Sparar till: "images?q=tbn:ANd9GcQstO11s7xqQ3m7JCapEAkdZ4hNZoUgWVuxG6etQQeUwDaVdRQG"

     0K ..........                                            100% 3,90M=0,003s

2011-01-11 22:58:05 (3,90 MB/s) - "images?q=tbn:ANd9GcQstO11s7xqQ3m7JCapEAkdZ4hNZoUgWVuxG6etQQeUwDaVdRQG" sparades [10838/10838]

--2011-01-11 22:58:05--  http://t0.gstatic.com/images?q=tbn:ANd9GcStyj_yl9LKWyFTC-_RJh9beGLZv8JjGXfWmQQ5EXFF4Tr-JBrf
Återanvänder befintlig anslutning till t0.gstatic.com:80.
HTTP-begäran skickad, väntar på svar... 200 OK
Längd: 6010 (5,9K) [image/jpeg]
Sparar till: "images?q=tbn:ANd9GcStyj_yl9LKWyFTC-_RJh9beGLZv8JjGXfWmQQ5EXFF4Tr-JBrf"

     0K .....                                                 100% 5,30M=0,001s

2011-01-11 22:58:05 (5,30 MB/s) - "images?q=tbn:ANd9GcStyj_yl9LKWyFTC-_RJh9beGLZv8JjGXfWmQQ5EXFF4Tr-JBrf" sparades [6010/6010]

--2011-01-11 22:58:05--  http://t0.gstatic.com/images?q=tbn:ANd9GcRtXy8LayrVD8Iu_EdcRFPOmvZN-LdGxDfVibGdddUuJsOJG5UGv_0PA
Återanvänder befintlig anslutning till t0.gstatic.com:80.
HTTP-begäran skickad, väntar på svar... 404 Not Found
2011-01-11 22:58:05 FEL 404: Not Found.

--2011-01-11 22:58:05--  http://t1.gstatic.com/images?q=tbn:ANd9GcR2kT2-ndZuHE_qPA5Utn3g5aRsIfl_6EZi4y3h-7WqJIlMIEAf
Slår upp t1.gstatic.com... 66.102.13.104, 66.102.13.105, 66.102.13.106, ...
Återanvänder befintlig anslutning till t0.gstatic.com:80.
HTTP-begäran skickad, väntar på svar... 200 OK
Längd: 11051 (11K) [image/jpeg]
Sparar till: "images?q=tbn:ANd9GcR2kT2-ndZuHE_qPA5Utn3g5aRsIfl_6EZi4y3h-7WqJIlMIEAf"

     0K ..........                                            100% 4,25M=0,002s

2011-01-11 22:58:05 (4,25 MB/s) - "images?q=tbn:ANd9GcR2kT2-ndZuHE_qPA5Utn3g5aRsIfl_6EZi4y3h-7WqJIlMIEAf" sparades [11051/11051]

--2011-01-11 22:58:05--  http://t3.gstatic.com/images?q=tbn:ANd9GcSFeQwLgqBpMmDws-DPAu64TcbHTzjqRdzvnR1cEs8HXj_jfKEL
Slår upp t3.gstatic.com... 66.102.13.106, 66.102.13.147, 66.102.13.99, ...
Återanvänder befintlig anslutning till t0.gstatic.com:80.
HTTP-begäran skickad, väntar på svar... 200 OK
Längd: 8882 (8,7K) [image/jpeg]
Sparar till: "images?q=tbn:ANd9GcSFeQwLgqBpMmDws-DPAu64TcbHTzjqRdzvnR1cEs8HXj_jfKEL"

     0K ........                                              100% 4,68M=0,002s

2011-01-11 22:58:05 (4,68 MB/s) - "images?q=tbn:ANd9GcSFeQwLgqBpMmDws-DPAu64TcbHTzjqRdzvnR1cEs8HXj_jfKEL" sparades [8882/8882]

FÄRDIG --2011-01-11 22:58:05--
Hämtade: 5 filer, 42K i 0,04s (935 KB/s)
Att spara raden med nyckelordet är ju inga problem med den här snutten, men det är ju inte där informationen jag vill åt finns...

Kod: Markera allt

cat logg | sed '/FEL/!d'
Har hållt på och tragglat med detta ett bra tag nu utan att komma på nåt. Är det någon som har några idéer om det?
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av Osprey »

Det där borde du kunna fixa med "fgrep -B 4 FEL filnamn"...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
PyroClastic
Inlägg: 12
Blev medlem: 29 okt 2010, 16:28
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av PyroClastic »

Jajjemen, så lätt var det :) Tack så mycket!
ycc
Inlägg: 1818
Blev medlem: 10 feb 2007, 04:08
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av ycc »

Utanför ämnet: Skönt att det kom att bra svar innan vi kom in i den mystiska världen av sed-kommandon över flera rader. ;) Så här blir det t.ex. visst om man skriver ut den funna raden tillsammans med den föregående och efterföljande raden.

Kod: Markera allt

cat log | sed -n -e '/FEL/{x;1!p;g;$!N;p;D;}' -e h > log2
[/ot]
Ubuntu/Linux - Grunder: En introduktion till Ubuntu och Linux
Ubuntu/Linux - Basics: An introduction to Ubuntu and Linux (experimental, automated translation)
PyroClastic
Inlägg: 12
Blev medlem: 29 okt 2010, 16:28
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av PyroClastic »

ycc skrev:Utanför ämnet: Skönt att det kom att bra svar innan vi kom in i den mystiska världen av sed-kommandon över flera rader. ;) Så här blir det t.ex. visst om man skriver ut den funna raden tillsammans med den föregående och efterföljande raden.

Kod: Markera allt

cat log | sed -n -e '/FEL/{x;1!p;g;$!N;p;D;}' -e h > log2
[/ot]
Shit! Jag ska ta och plöja igenom den här guiden när jag hittar tid. Vore inte fel att bemästra dom där uttrycken...
ycc
Inlägg: 1818
Blev medlem: 10 feb 2007, 04:08
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av ycc »

Länken du skickade är en klassiker.

sed läser in och bearbetar filen rad för rad i "pattern space" (PS). Data (flera rader om man vill) kan sparas i "hold space" (HS). Liknar nästan assembler.

Sedan får man kolla vad varje kommando gör (x=byt plats på innehållet i PS och HS, p=print, D=delete en rad ur PS och börja om med nästa rad ...)

:)
Ubuntu/Linux - Grunder: En introduktion till Ubuntu och Linux
Ubuntu/Linux - Basics: An introduction to Ubuntu and Linux (experimental, automated translation)
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av m!rage »

Det är väl wget du använder i första inlägget? Du kan använda flaggan -nv för att minska informationen den spottar ur sig till en rad. Då kan du enklare plocka ut den information du vill ha med exempelvis

Kod: Markera allt

cat loggfil | grep "FEL"
eller liknande
Användarvisningsbild
Barre
Inlägg: 2298
Blev medlem: 13 dec 2006, 10:23
OS: Ubuntu
Ort: Stockholm
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av Barre »

lite, men ändå inte helt, OT.

Varför envisas det om att först köra cat och sen en pipe till grep och/eller sed när både grep och sed tar en fil som kommando?

Kod: Markera allt

 grep "FEL" <filnamn>
och

Kod: Markera allt

 sed -n '/FEL/p' <filnamn>
som exempel
________________________________________________________________
twitter @ BarreGargamel
blogg @ Gargamel.NU
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av m!rage »

Tänkte inte på det ;)
ycc
Inlägg: 1818
Blev medlem: 10 feb 2007, 04:08
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av ycc »

Det var en bra synpunkt, lite förvånad kan man också bli om man gör

Kod: Markera allt

Varning använd inte detta kommando (inte samma infil och utfil)
cat log | sed ... > log
och filens innehåll försvinner!
Ubuntu/Linux - Grunder: En introduktion till Ubuntu och Linux
Ubuntu/Linux - Basics: An introduction to Ubuntu and Linux (experimental, automated translation)
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av Osprey »

ycc skrev:Det var en bra synpunkt, lite förvånad kan man också bli om man gör

Kod: Markera allt

Varning använd inte detta kommando (inte samma infil och utfil)
cat log | sed ... > log
och filens innehåll försvinner!
Det är väl ganska självklart att filens innehåll kan försvinna om man använder "sed" och ">", men det kan det ju för den delen göra med t.ex "dG" i vim också... eller med t.ex "grep foobar log > log"... eller är det jag som inte fattar riktigt nu.. ???
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
ycc
Inlägg: 1818
Blev medlem: 10 feb 2007, 04:08
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av ycc »

Man skall ju inte ha förutfattade meningar. Det hade jag första gången jag gjorde cat till samma filnamn som inputfilen.

Lite grand som att sätta
a = a + 1
borde funka, tyckte jag

Jag tyckte det vore logiskt om pipen utvärderades från vänster till höger.

Jag har för mig att en del operativsystem funkar så att en ny fil skapas under ett temporärnamn och filkatalogens pekare för det äkta filnamnet inte flyttas till den nya filen förrän filen stängs. (Jag kommer dock inte nu på vilka OS som gör det.)

Då kan man ju utnyttja samma fil som in- och ut-fil.
Ubuntu/Linux - Grunder: En introduktion till Ubuntu och Linux
Ubuntu/Linux - Basics: An introduction to Ubuntu and Linux (experimental, automated translation)
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av Osprey »

Det vore intressant att veta vad och om det blir någon skillnad med "cat log | sed ... > log" och "cat log | sed ... | cat > log". Problemet med iallafall det första alternativet är ju att "sed" normalt sett bearbetar data radvis och inte filvis. Detta kommer så sett att leda till att den läser första raden, bearbetar den och skriver ut den, läser andra raden, bearbetar den och skriver ut den etc... samtidigt som ">" implicit innebär att "skriv ut data till en ny fil"...

För övrigt vet jag att sed kan ha lite egenheter för sig med just det där med när den anser att den har tillräckligt med data (en rad) för att börja jobba. I vanliga linux/unix-textfiler där radbegränsningen ofta utgörs av '\n' så är detta inget problem, men när man har filer där raderna istället är begränsade av '\r' eller för den delen '\012' så kan det bli lite udda resultat... :)

Att skapa en temporärfil och sedan inte ersätta den ursprungliga filen förrän denna stängs, vore ofta en mycket bra lösning men jag vet inte heller vilka OS som eventuellt använder detta.

I OpenVMS skapas istället en nu version av filnamnet varje gång man öppnar den för skrivning. Först börjar den med "filnamn;1" och fortsätter med "filnamn;2", "filnamn;3" etc. och om man refererar till filen med bara "filnamn" så väljs automatiskt den senaste. Detta är faktiskt rätt behändigt och ibland har jag önskat att det funnits även i Linux, på så sätt kan man spara t.ex de senaste 3 versionerna av en fil. Detta kan vara guld värt när man utvecklar nya program och upptäcker att senaste ändringen man gjorde inte alls var så lyckad. Då kan man öppna filen ett par versioner bakåt och spara om den som den senaste. Visst kan många versionshanterare fixa detta också, men det ligger liksom inte som standard ute i en shell...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
ycc
Inlägg: 1818
Blev medlem: 10 feb 2007, 04:08
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av ycc »

Vore intressant att se resultatet av dina exempel Osprey, jag sitter inte så jag kan prova, tyvärr. Undrar dock om inte risk för överskrivning föreligger ändå?

Har det att göra med hur Unix/Linux "betraktar filer och device som data-strömmar"??? (Vad det nu betyder rent praktiskt?) Självklart sparar det utrymme och kanske även tid att inte använda temporärfiler. sed-redigering är ju grymt effektiv och fungerade bra redan i en tid när man räknade kB och inte MB/GB.

Annars går tydligen vanlig tvättsvamp bra
http://linux.die.net/man/1/sponge
Ubuntu/Linux - Grunder: En introduktion till Ubuntu och Linux
Ubuntu/Linux - Basics: An introduction to Ubuntu and Linux (experimental, automated translation)
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av David Andersson »

ycc skrev: Jag tyckte det vore logiskt om pipen utvärderades från vänster till höger.
En av ideerna med pipar är att programmen ska kunna köra parallellt. När den första börjar producera output kan den andra börja jobba på det innan den första är klar med hela filen. Om den sista skriver på en fil så är det alltså inte säkert att den första har läst klart filen än.

Om det bara vore det, och inga program i pipen gör data större, utan bara lika eller kortare (som grep), då kommer programmet som läser filen alltid att ligga före den som skriver. Den läser data längre in i filen än det som håller på att skrivas över. (I princip alltså. Det ska man inte alltid lita på.)

Men, det är inte bara det. När skalet ser ">filnamn" så öppnar den filen för skrivning innan den startar programmen, för att stdout ska ha nånstans att ta vägen. Så filen blir i princip garanterat tom.
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av m!rage »

ycc skrev:Det var en bra synpunkt, lite förvånad kan man också bli om man gör

Kod: Markera allt

Varning använd inte detta kommando (inte samma infil och utfil)
cat log | sed ... > log
och filens innehåll försvinner!
I detta fallet kan du använda

Kod: Markera allt

sed -i 'sed-kommando' log
för att skriva ändringarna till samma fil, lärde jag mig igår.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av Osprey »

m!rage skrev: I detta fallet kan du använda

Kod: Markera allt

sed -i 'sed-kommando' log
för att skriva ändringarna till samma fil, lärde jag mig igår.
Ahhh, nu blev jag glad för jag lärde mig något nytt! :D
(undrar när det tillkom till sed..?)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av Konservburk »

Osprey skrev:(undrar när det tillkom till sed..?)
2001-09-25
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Sed - radera antal rader i förhållade till nyckelord?

Inlägg av Osprey »

Konservburk skrev:
Osprey skrev:(undrar när det tillkom till sed..?)
2001-09-25
Tack! och aha, sådär lite drygt 15 år efter att jag började lära mig "sed"... det förklarar ju en del (och bevisar att jag fuskar lite och inte läser man-sidan sådär jätteofta)... ;D
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Skriv svar

Återgå till "Terminalforum"