[bash] grep -v "^..." op zowel stderr als stdout

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 29-09 16:43
Hallo,

Ik probeer enkele 1000en overbodige lijnen uit de apt-get output te filteren.
Dit is groterdeels gelukt, maar er blijven er nog enkele hardnekkige over...

apt-get dist-upgrade gebruikt dpkg onderhuids. Hoewel ik het loop met -q (of -qq) , blijft dpkg zelf toch nog overbodige rommel uitsturen,

bv dit naar stdout:
(Reading database ... 10%
(Reading database ... 20%
(Reading database ... 30%
...

en bv dit naar stderr:
Extracting templates from packages: 10%
Extracting templates from packages: 20%
Extracting templates from packages: 30%
...

Het lukt me wel om de meer dan 1000 lijnen naar stdout eruit te filteren, maar niet om de overbodige lijnen naar stderr eruit te filteren.

Omdat ik zeker niet teveel eruit wil filteren, filter ik op "^..." om enkel lijnen eruit te filteren die beginnen met een bepaalde string. Bij het sturen van stderr naar stdout loopt dit echter mis, aangezien de "new line chars" op het einde van een lijn staan. Zo komt de stderr ergens in het midden van een lijn van stdout en dan pakt mijn filter ze niet mee...

Weet iemand hoe ik dit kan oplossen?

Momenteel probeer ik het zo (maar dit werkt dus niet voor de stderr)

apt-get -y -q dist-upgrade 2>&1 | grep -v "^(Reading database ... " | grep -v "^Extracting templates from packages: "
if [[ ${PIPESTATUS[0]} -ne 0 ]]; then
...
fi

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Wat is nou precies je doel hiermee? Heb je een of ander cron-job die automatisch updates installeert? Want dat kan netter met cron-apt. Die kan mailen als er iets fout gaat of altijd mailen, maar krijg je niet alle console output die je nu lijkt te willen filteren.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 29-09 16:43
Dit is deel van een quarterly (en binnenkort monthly) patch script dat ook non-interactive moet kunnen draaien.
Dit script doet meer dan alleen de dist-upgrade en logged alle output dmv van tee naar het scherm en naar een file.

Het is de bedoeling dat alle output na afloop van het script nagekeken wordt op (potentiele) issues.Dus niet alleen als de apt-get exit met een error code, maar ook onverwachte warnings enzo moeten kunnen gespot worden.

Het maakt maw veel uit als de output van apt-get maar +-1500 lijnen (met grep -v) is ipv +-2500 lijnen (zonder grep -v)

[ Voor 43% gewijzigd door Mastakilla op 21-03-2016 15:18 ]


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Gaat er dan wel informatie naar stderr die je hebben wilt?

Acties:
  • 0 Henk 'm!

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 29-09 16:43
Zowel op het scherm, als in de output file, is stderr en stdout door elkaar.

De meeste grote issues worden opgevangen dmv de exit codes uit te lezen en daarop te reageren

[ Voor 40% gewijzigd door Mastakilla op 21-03-2016 15:26 ]


Acties:
  • 0 Henk 'm!

  • Blokker_1999
  • Registratie: Februari 2003
  • Laatst online: 13:50

Blokker_1999

Full steam ahead

Zelf nooit geprobeerd en van wat ik direct zie op internet is er geen 100% succesrate maar het volgende zou kunnen helpen en moet in principe dpkg het zwijgen opleggen:

apt-get install -qq -o=Dpkg::Use-Pty=0 <packages>

No keyboard detected. Press F1 to continue.


Acties:
  • 0 Henk 'm!

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 29-09 16:43
ook reeds geprobeerd :) en het werkt niet op Ubuntu 12.04 :(

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
code:
1
2
3
4
5
6
7
8
9
$ cat example
#!/bin/bash
printf "hello world" >&2
echo ohnoes
printf "!\n" >&2
$ ./example 2>&1
hello worldohnoes
!
$

Je wilt dus eigenlijk twee regels "hello world!\n" en "ohnoes\n".
Is de volgorde wel relevant? Anders kun je naar twee files schrijven en de files afzonderlijk verwerken.

Anders moet je twee named pipes maken die hun input bufferen tot een newline.

[ Voor 19% gewijzigd door GlowMouse op 21-03-2016 17:11 ]


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Is het nodig om het direct te bekijken, of mag het ook achteraf als apt klaar is? Hoe dan ook, kijk eens naar /var/log/apt/term.log. Daarin komt alle terminal uitvoer terecht. Alles, stdout en stderr. Zelfs als je een dialog venster krijgt (bijvoorbeeld bij het updaten van libc voor het herstarten van services).

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Als je al de "2>&1" truuk gebruikt dan ligt het probleem waarschijnlijk aan je regex die niet matcht...

Trek je dit in twijfel, draai dan even het commando met "&>/dev/null"; als je dan nog iets ziet dan lieg ik.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 29-09 16:43
Als ik
grep -v "Extracting templates from packages: "
ipv
grep -v "^Extracting templates from packages: "
dan zijn ze er wel uit...

Dus regex is idd "fout" (met als reden dat het begin van een lijn van de error output niet klopt omdat ik stdout en stderr meng)

Het is idd de bedoeling dat je op het scherm ook in realtime de output van de apt-get nog kan volgen.

Nu filter ik de meeste overbodige lijnen (+-1000) al weg met 'grep -v "^(Reading database ... "' uit stdout te filteren.
'grep -v "^Extracting templates from packages: "' uit stderr filteren, zijn maar een 10 tal lijnen en is dus maar "afwerking", om het mooi en af te maken.

Ik vroeg me echter af of ik een "eenvoudige" oplossing voor dit probleem over het hoofd zag, maar als dit niet bestaat is dit ook geen ramp...

Acties:
  • 0 Henk 'm!

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 29-09 16:43
Ik heb net een beetje zitten testen en als ik ipv het weg te filteren, het er juist op filter
apt-get -y -q dist-upgrade 2>&1 | grep "Extracting templates from packages: "
dan zie ik duidelijker wat ik eigenlijk er probeer uit te halen...

<CR>
Extracting templates from packages: 10%<CR>
Extracting templates from packages: 21%<CR>
Extracting templates from packages: 31%<CR>
Extracting templates from packages: 42%<CR>
Extracting templates from packages: 53%<CR>
Extracting templates from packages: 63%<CR>
Extracting templates from packages: 74%<CR>
Extracting templates from packages: 85%<CR>
Extracting templates from packages: 95%<CR>
Extracting templates from packages: 100%<LF>

Wat ik nu aan het proberen ben is ipv te filteren op "^Extracting templates from packages: ", te filteren op "<CR>Extracting templates from packages: ".

Het lijkt dat dit zo gelukt is!:
apt-get -y -q dist-upgrade 2>&1 | grep -v "^(Reading database ... " | grep -v $'\rExtracting templates from packages: '

Bedankt voor de support...

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Je kan ook eens kijken wat de eerder genoemde term.log doet bij het uitvoeren van apt. Als die in real-time wordt geschreven, hoef je je geen zorgen te maken over output redirection en andere dingen. Maar goed, als dit werkt, kan dit ook.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Als je de CR's en LF's hetzelfde wil behandelen kun je natuurlijk ook
apt-get -y -q dist-upgrade 2>&1 | tr '\r' '\n' | grep ...
Pagina: 1