133 votes

Obtenir le dernier champ en utilisant awk substr

J'essaie d'utiliser awk pour obtenir le nom d'un fichier à partir du chemin absolu du fichier.
Par exemple, si l'on donne le chemin d'entrée /home/parent/child/filename Je voudrais obtenir filename J'ai essayé :

awk -F "/" '{print $5}' input

qui fonctionne parfaitement.
Cependant, je fais du codage dur $5 ce qui serait incorrect si mon entrée a la structure suivante :

/home/parent/child1/child2/filename

Donc une solution générique nécessite de toujours prendre la dernier (qui sera le nom du fichier).

Existe-t-il un moyen simple de faire cela avec la fonction substr d'awk ?

3voto

Adriano_epifas Points 180

Je sais que j'ai 3 ans de retard sur ce sujet mais.... vous devriez envisager l'expansion des paramètres, c'est intégré et plus rapide.

si votre entrée est dans une variable, disons $var1, il suffit de faire ${var1##*/} . Regardez ci-dessous

$ var1='/home/parent/child1/filename'
$ echo ${var1##*/}
filename
$ var1='/home/parent/child1/child2/filename'
$ echo ${var1##*/}
filename
$ var1='/home/parent/child1/child2/child3/filename'
$ echo ${var1##*/}
filename

3voto

Nicko Glayre Points 310

Avec 5 ans de retard, je sais, merci pour toutes les propositions, je faisais ça de la manière suivante :

$ echo /home/parent/child1/child2/filename | rev | cut -d '/' -f1 | rev
filename

Heureux de constater qu'il y a de meilleures manières

0voto

Vous pouvez sauter toutes ces regex complexes :

 echo '/home/parent/child1/child2/filename' | 

 mawk '$!_=$-_=$NF' FS='[/]'
                                  filename

Avant-dernier :

 mawk '$!--NF=$NF' FS='/'
                           child2

3ème dernier champ :

 echo '/home/parent/child1/child2/filename' | 

 mawk '$!--NF=$--NF' FS='[/]'

                    child1

4ème - dernier :

 mawk '$!--NF=$(--NF-!-FS)' FS='/'

 echo '/home/parent/child000/child00/child0/child1/child2/filename' |
                                     child0
 echo '/home/parent/child1/child2/filename'
             parent

caveat majeur :

- `gawk/nawk` has a slight discrepancy with `mawk` regarding 

   - how it tracks multiple,
   - and potentially conflicting, decrements to `NF`, 

   - so other than the 1st solution regarding last field, 
   - the rest for now, are only applicable to `mawk-1/2`

0voto

Je viens de réaliser que c'est beaucoup plus propre de cette façon en mawk/gawk/nawk :

echo '/home/parent/child1/child2/filename' | …

'

awk ++NF FS='.+/' OFS=      # updated such that 
                            # root "/" still gets printed

'

filename

-1voto

SARATH Points 51

Vous pouvez également utiliser :

    sed -n 's/.*\/\([^\/]\{1,\}\)$/\1/p'

o

    sed -n 's/.*\/\([^\/]*\)$/\1/p'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X