[Linux/Bash] String filteren

Pagina: 1
Acties:

  • m33p
  • Registratie: September 2002
  • Laatst online: 06-02 20:21
Ik zit met iets wat ik niet voor elkaar krijg. Ik krijg een string binnen welke de output van een commando is (een reek errors) waar uit ik wat wil strippen. De string is dit:

code:
1
tar: Removing leading `/' from member names Total bytes written: 8550400 (8.2MiB, 1.4MiB/s)


Nou moet het "tar: Removing leading `/' from member names " gedeelte er uit. Dit deel is altijd lang dus als er een functie is welke de eerste X aantal karakters er af kan halen is het ook goed, ik heb deze functie alleen nog niet kunnen vinden.

Disclaimer: Ik heb gezocht maar ik heb ook nogal haast en ben een beginnende bash scripter

Alvast bedankt :)

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 04-02 17:31
Kijk hier eens! Of anders is google je vriend wel

Hail to the king baby!


  • Nitroglycerine
  • Registratie: Januari 2002
  • Laatst online: 21:26

Nitroglycerine

Autisme: belemmering en kracht

wat dacht je van:
code:
1
2
3
4
5
6
7
8
TEMPVAR1=string
echo ${TEMPVAR1} | while read VAR1 VAR2 VAR3 VAR4 VAR5 VAR6 VAR7 VAR8 VAR9 TEMPVAR3
do
TEMPVAR2=${VAR1}" "${VAR2}" "${VAR3}" "${VAR4}" "${VAR5}" "${VAR6}" "${VAR7}" "${VAR8}" "${VAR9}
done

echo ${TEMPVAR2]
echo ${TEMPVAR3}


TEMPVAR2 = tar: Removing leading `/' from member names
TEMPVAR3 = Total bytes written: 8550400 (8.2MiB, 1.4MiB/s)

Of makkelijker:

code:
1
2
3
4
VAR='string'
TEMPVAR2=$(cat ${VAR} | awk -FT '{print $1}')
TEMPVAR3=$(cat ${VAR} | awk -FT '{print $2}')
TEMPVAR3="T"${TEMPVAR3

[ Voor 58% gewijzigd door Nitroglycerine op 01-02-2006 10:35 ]

Hier kon uw advertentie staan


  • Semyon
  • Registratie: April 2001
  • Laatst online: 20:53
Nitroglycerine schreef op woensdag 01 februari 2006 @ 10:31:
Of makkelijker:

code:
1
2
3
4
VAR='string'
TEMPVAR2=$(cat ${VAR} | awk -FT '{print $1}')
TEMPVAR3=$(cat ${VAR} | awk -FT '{print $2}')
TEMPVAR3="T"${TEMPVAR3
of nog makkelijker met cut

pipe het door
code:
1
| cut -d\  -f 8-


bijvoorbeeld

code:
1
2
3
 echo "tar: Removing leading / from member names Total bytes written: 8550400 (8.2MiB, 1.4MiB/s)" | cut -d\  -f 8-

Total bytes written: 8550400 (8.2MiB, 1.4MiB/s)


man cut for the uitleg

Only when it is dark enough, can you see the stars


  • Paul
  • Registratie: September 2000
  • Laatst online: 20:55
Kun je niet beter de oorzaak aanpakken, oftewel de / niet meegeven bij je lijst dingen die hij moet tarren? (ik kan het momenteel zelf even niet testen dus het kan zijn dat ik onzin uitkraam hoor ;) :P )

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Verwijderd

Er zijn tal van oplossing met perl, awk, sed, et cetera te geven. Een paar van bovenstaande zijn echt heel onlogisch (die met al die VAR's), en die met die cat en dan awk. Je wilt toch geen bestand dat 'string' heet cat'en? Bedoel je niet 'echo'?

AWK scheidt standaard op spatie, dus met die wetenschap, pipe je het door:
code:
1
awk '{printf("%s\n",substr($0,index($0,$8)))}'


Goed, dat is wat obscuur:

code:
1
| sed 's#.*Total#Total'


werkt ook.

Maar alleen met jouw voorbeeld? Heb je bijvoorbeeld meerdere regels fouten? Dan werkt die eerste AWK niet goed, die sed misschien wel. En waarom komen de fouten niet op regels? Kun je stderr niet redirecten naar /dev/null? Dan ben je ook je fouten kwijt.

Als het meerdere regels zijn, is het dan niet zo dat je alleen de laatste met de total wil hebben, want normaliter komt de output niet gescheiden door spaties maar door newlines uit het commando. Pipe het dan door:

code:
1
| tail -n1


Of:
code:
1
|sed -n '$p'


Of, specifieker (dan hoeft het niet de laatste regel te zijn):
code:
1
|sed -n '/Total bytes/p'


Kortom, het is me wat onduidelijk waarom jij precies de uitvoer zo hebt als je hebt, en of die uitvoer altijd precies is zoals je nu aangeeft, of mogelijk ook groter.
Pagina: 1