# Aide pour awk!

**URL:** <https://www.debian-fr.org/t/aide-pour-awk/32392>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 2:21 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392 "2016-02-21T02:21:44Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![vinced86](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/b487fb/32.png) [@vinced86](https://www.debian-fr.org/u/vinced86)\
**Post date:** [Février 21, 2016, 2:21 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/1 "2016-02-21T02:21:44Z")

</div>

Bonjour a tous,  
merci de bien vouloir m’aider, je galère avec un problème qui sera je pense très simple pour vous…  
Je dois récupérer absolument avec la commande AWK un bout de repertoire je m’explique:

/home/titi/toto/

Avec la commande awk doit maider a recuperer "toto"  
Qu’elle est la syntaxe??  
Merci d’avance!!

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:21 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/2 "2016-02-21T02:21:45Z")

</div>

```auto
Comme ça ? On découpe sur '/' puis on affiche uniquement l'avant dernier élément.

Tu veut que ça puisse fonctionner avec sous sans / à la fin ? Ou tu veut pouvoir l'intégrer à un code existant ? Alors :
[code]awk '{ n=split("/home/titi/toto/", dir, "/"); if(dir[n] == "") { print dir[n-1] } else { print dir[n]; } }'[/code]
```

Comme ça ? On découpe sur ‘/’ puis on affiche uniquement l’avant dernier élément.

Tu veut que ça puisse fonctionner avec sous sans / à la fin ? Ou tu veut pouvoir l’intégrer à un code existant ? Alors :

```auto

```

---

<div class="post-metadata">

**Author:** ![lcaz](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lcaz/32/3546_2.png) [@lcaz](https://www.debian-fr.org/u/lcaz)\
**Post date:** [Février 21, 2016, 2:27 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/3 "2016-02-21T02:27:43Z")

</div>

[quote=“vinced86”]Bonjour a tous,  
merci de bien vouloir m’aider, je galère avec un problème qui sera je pense très simple pour vous…  
Je dois récupérer absolument avec la commande AWK un bout de repertoire je m’explique:

/home/titi/toto/

Avec la commande awk doit maider a recuperer "toto"  
Qu’elle est la syntaxe??  
Merci d’avance!![/quote]

Tu as absolument besoin de awk ? Pourquoi faire compliqué quand on peut faire simple ?

`abc="/home/titi/toto/"
abc="${abc%/}" # "/home/titi/toto", peu importe si le '/' de fin était présent
abc="${abc##*/}" # "toto"`

---

<div class="post-metadata">

**Author:** ![Dixippe](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/5f8ce5/32.png) [@Dixippe](https://www.debian-fr.org/u/Dixippe)\
**Post date:** [Février 21, 2016, 2:27 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/4 "2016-02-21T02:27:47Z")

</div>

Encore plus simple: basename /home/titi/toto 😃

---

<div class="post-metadata">

**Author:** ![limax](https://www.debian-fr.org/user_avatar/www.debian-fr.org/limax/32/3886_2.png) [@limax](https://www.debian-fr.org/u/limax)\
**Post date:** [Février 21, 2016, 2:27 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/5 "2016-02-21T02:27:48Z")

</div>

> [@Dixippe](#):
>
> Encore plus simple: basename /home/titi/toto 😃

😮 je ne connaissais même pas  
Je viens de voir qu’il existe aussi dirname (coreutils)

---

<div class="post-metadata">

**Author:** ![lcaz](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lcaz/32/3546_2.png) [@lcaz](https://www.debian-fr.org/u/lcaz)\
**Post date:** [Février 21, 2016, 2:27 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/6 "2016-02-21T02:27:56Z")

</div>

> [@Dixippe](#):
>
> Encore plus simple: basename /home/titi/toto 😃

Oui, mais…

[code]time find /usr | xargs -l1 basename &\>/dev/null

real 0m13.984s  
user 0m3.190s  
sys 0m10.780s

time for i in $(find /usr); do i=${i%/}; echo ${i##\*/} &\>/dev/null; done

real 0m1.072s  
user 0m0.551s  
sys 0m0.442s[/code]

…c’est long.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:27 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/7 "2016-02-21T02:27:59Z")

</div>

Mauvais benchmark inverse les deux commandes la différence seras moins grande.

---

<div class="post-metadata">

**Author:** ![lcaz](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lcaz/32/3546_2.png) [@lcaz](https://www.debian-fr.org/u/lcaz)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/8 "2016-02-21T02:28:00Z")

</div>

Ah, en effet. Mais ne pas avoir à appeler basename fait quand même une différence d’un facteur 2 (à vue d’oeil), sur mon poste. Bon, oui, c’est moins bien que le facteur 13 🙂

Sur un 2xQuadcore avec du sas :

[code]# time for i in $(du / | cut -f2 2\>/dev/null); do i=${i%/}; echo ${i##\*/}; done &\>/dev/null

real 0m0.249s  
user 0m0.108s  
sys 0m0.124s

# time du / 2\>/dev/null | cut -f2 | xargs -l1 basename &\>/dev/null

real 0m1.824s  
user 0m0.436s  
sys 0m1.244s[/code]

Ca fait tout de même une belle différence, mais en effet c’est intéressant que dans le cas ou on réitère beaucoup.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/9 "2016-02-21T02:28:00Z")

</div>

> [@lcaz](#):
>
> Ah, en effet. Mais ne pas avoir à appeler basename fait quand même une différence d’un facteur 2 (à vue d’oeil), sur mon poste. Bon, oui, c’est moins bien que le facteur 13 🙂

Pour l’explication ça viens de la mise en cache du noyau des informations du système de fichier. Pour s’en convaincre il suffit de lancer deux fois du ou find avec exactement les même arguments.

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/10 "2016-02-21T02:28:02Z")

</div>

Le benchmark initial est d’autant plus faux que les éléments à comparer diffèrent.

Pour qu’il soit juste, il faudrait tester :

```auto
#/bin/bash
time while read ; do basename "${REPLY}"; done < <(find /usr) >&/dev/null
#et
time while read ; do i="${REPLY%/}"; echo ${i##*/}; done < <(find /usr) >&/dev/null
```

en effet, le résultat initial tient compte de critères supplémentaires faussant le test :

- création et suppression de sous processus ayant pour origine l’utilisation du pipe
- utilisation de xargs donc mise en mémoire/libération d’un programme supplémentaire ainsi que des librairies nécessaires

Par ailleurs, il n’est pas nécessaire d’effectuer de benchmark pour prouver cela : l’utilisation d’outils externes au langage de script contextuel implique des accès disques (recherche des binaires et librairies) et manipulation mémoires (chargement, déchargement) supplémentaires comparé à l’utilisation des builtins. Le temps d’exécution est donc impacté.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/aide-pour-awk/32392/11 "2016-02-21T02:28:03Z")

</div>

L’ensemble des éléments dont tu parle, bien que justes, sont epsilon face à l’accès disque mis en cache (pour ça que j’en ai pas parlé). 🙂

Pour ce qui est de l’avantage du builtin face à la commande extérieure, oui c’est plus efficace mais il faut savoir quand les utiliser et quand ne pas les utiliser. Pour des expressions complexes ou combinées sed peut être plus efficace qu’une version en shell qui généreras pleins de variables sh intermédiaire.

Par contre à partir du moment où on utilise un programme extérieure il est bon de lui en faire faire le plus et de limiter leur nombre :

```auto

```

est clairement moins efficace qu’un awk (sans compter que le grep devrait se mettre avant le sed).
