awk en tar output parsen - spaties in bestandsnaam

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Ik ben aan het lezen in O'Reilly - sed & awk om mijn kennis van awk aan te scherpen. awk '{print $6}' kende ik al maar ik wil wat verder gaan. Ik heb ook een karrevracht LTO tapes die ik met tar gevuld heb met data. De meta-data die op die tapes staat heb ik half manueel al "geïmporteerd" (lees: tar -tvf /dev/st0 > dokuwiki.txt file) in een dokuwiki zodat ik kan gaan zoeken op een "string" die me dan een pagina geeft. Die pagina is dan een tape label. Stel dat ik ooit op zoek ben naar /mnt/nas/photo/2018/04/12/IMG_1992.CR2 dat ik 8 pagina's krijg die 8 tapes representeren waarop die file staat.

De output van tar bestaat uit 6 velden, de field separator is één of meerdere spaties. Jammer maar helaas zitten er in meerdere bestandsnamen ook spaties. Als ik awk '{print $6}' doe, krijg ik soms een gedeeltelijke bestandsnaam door reden hoogstwaarschijnlijk duidelijk voor de lezer. Is er een manier om dat deftig op te vangen met awk?

awk zet ik even in het vet omdat ik mijn awk-kennis wil bijschaven, ook al is het mogelijk niet de meest efficiënte tool om dit te doen.

Relevante software en hardware die ik gebruik
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)
tar (GNU tar) 1.30

Alle reacties


Acties:
  • +1 Henk 'm!

  • Blokker_1999
  • Registratie: Februari 2003
  • Laatst online: 10:44

Blokker_1999

Full steam ahead

Als iemand die helemaal niets van awk kent krijg ik snel deze oplossing gevonden:

awk '{$1=$2=$3=$4=$5=""; print $0}'

[ Voor 32% gewijzigd door Blokker_1999 op 14-12-2020 06:51 . Reden: bronvermelding ]

No keyboard detected. Press F1 to continue.


Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Ah thanks, ik had ook al op google liggen zoeken maar niet meteen iets gevonden.

Dan moet ik eigenlijk zien dat ik per record alles moet doen met $1..$5, en pas daarna
code:
1
2
$1=$2=$3=$4=$5=""
filename=$0

En dan kan ik gaan werken met de filename mocht ik dat willen.

Is er misschien nog een andere manier van werken? Vanaf ik bovenstaande code uitvoer, ben ik de info in alle andere velden "kwijt" per iteratie.

Acties:
  • 0 Henk 'm!

  • Patrock
  • Registratie: Augustus 2011
  • Laatst online: 08:32

Patrock

Eat - ride - sleep - repeat

Heb je misschien enkele (redacted) regels zodat wij kunnen zien wat gefilterd moet worden?
Mogelijk kun je wat met een capture group met het gedeelte voor .xx of .xxx, of een andere field seperator gebruiken?

Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
Op zich zijn de regels redelijk voospelbaar.
code:
1
2
-rwxrwxrwx 1028/users     8196 2019-12-08 10:04 ./Bestand met soms een spatie erin.log
-rwxrwxrwx 1028/users     8196 2019-12-08 10:04 ./of een/pad/met nog meer spaties erin.txt


Of als de laatste file niet meer op huidige tape paste en het was een multi volume krijg je als eerste lijn in een text file dit:
code:
1
M--------- 0/0          645438 1970-01-01 01:00 ./of een /pad/met nog meer spaties erin.txt--Continued at byte 28528128--

maar goed, dat kan ik wel opvangen denk ik
code:
1
2
3
$1 ~ /^M---------/ {
    do something else
}

Acties:
  • +1 Henk 'm!

  • SambalBij
  • Registratie: September 2000
  • Laatst online: 19-09 19:56

SambalBij

We're all MAD here

Enig googlen in de trant van 'awk field until end of line' komt bijvoorbeeld hier mee:
code:
1
awk '{for(i=6; i<=NF; ++i) printf "%s ", $i; print ""}'



code:
1
2
3
4
5
6
7
8
9
10
11
12
aed@host:~$ tar tvf test.tar
drwxr-xr-x aed/aed           0 2020-12-14 08:43 test/
-rw-r--r-- aed/aed           0 2020-12-14 08:43 test/test 4 met spaties.txt
-rw-r--r-- aed/aed           0 2020-12-14 08:42 test/test1.txt
-rw-r--r-- aed/aed           0 2020-12-14 08:42 test/test2.txt
-rw-r--r-- aed/aed           0 2020-12-14 08:42 test/test3.txt
aed@host:~$ tar tvf test.tar | awk '{for(i=6; i<=NF; ++i) printf "%s ", $i; print ""}'
test/
test/test 4 met spaties.txt
test/test1.txt
test/test2.txt
test/test3.txt

[ Voor 63% gewijzigd door SambalBij op 14-12-2020 08:44 ]

Sometimes you just have to sit back, relax, and let the train wreck itself


Acties:
  • 0 Henk 'm!

  • bucovaina89
  • Registratie: Juli 2010
  • Laatst online: 27-07 17:55
@SambalBij Ah ik denk dat dat is wat ik nodig heb. Ik snap de syntax nog niet goed (hoofdstuk Conditional, Loops and Arrays heb ik nog niet gelezen).

Ik vermoed dat deze als het aantal velden (NF) groter of gelijk is aan 6, i blijft incrementen en telkens veld $i printen tot $i>NF.
Pagina: 1