# Recherches ocurrences dans les dernières lignes

**URL:** <https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443 "2016-02-21T03:41:06Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/21 "2016-02-21T03:41:25Z")

</div>

Quand tu écris «&nbsp;mv&nbsp;», ça va écraser le fichier définitif ?

```auto
awk "NR<10||NR>20" fichier > fichier2 && mv fichier2 fichier
```

Pour mon exemple, même s’il y a des moyens plus efficaces ou plus courts, je veux me faire un mini script qui supprime les «&nbsp;Explanations…&nbsp;» du fichier preferences.  
Je sais que ce dernier s’arrête à la ligne 53 et qu’ensuite viennent les paquets qui ont été placés là par ma réponse (p) lors de l’upgrade, genre :

`Explanation: Pinned by apt-listbugs at Sat Oct 22 01:11:23 +0200 2011
Explanation: #642572: liblucene2-java: cross dependencies prevent the installation of eclipse-cdt
Package: liblucene2-java
Pin: version 2.9.4+ds1-2
Pin-Priority: 1000
`  
Parfois, il y en a plusieurs et même beaucoup, donc avant de refaire une MAJ la semaine suivante, je supprime ces «&nbsp;exclus&nbsp;» car en général, la plupart ont été guéris.  
Je me refais donc un preferences propre.  
Mon script serait :

```auto
awk "NR<54" /etc/apt/preferences > /etc/apt/pref-relais && mv /etc/apt/pref-relais /etc/apt/preferences
```

Je suppose que la commande doit être agrémenté d’un «&nbsp;sudo&nbsp;».

EDIT :  
Ça fonctionne parfaitement ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")

---

<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, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/22 "2016-02-21T03:41:25Z")

</div>

Et ça ça marche ?

```auto

```

Ça serait plus fiable je pense (tu ne pars pas de l’hypothèse que ton fichier de préférence fait 53 lignes).

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/23 "2016-02-21T03:41:25Z")

</div>

Oui, tu as raison pour le cas où ça serait un tuto mais ici, il s’agit d’un truc perso et je suis sûr des N° de lignes et j’ai une marge supplémentaire

`...
49 Package: *
50 Pin: release o=Boisson,c=divers
51 Pin-Priority:490
52
53 ###########################################################################################
54
55`

Mais j’ai un autre problème : j’ai fait le test sur un montage maison mais en réel, il n’admet pas directement sudo pour écrire 😮

`ricardo@sid-sda8:~$ sudo awk "NR<54" /etc/apt/preferences > /etc/apt/pref-relais && mv /etc/apt/pref-relais /etc/apt/preferences
bash: /etc/apt/pref-relais: Permission non accordée
`  
Si je place pref-relais dans ~/, il me demande confirmation pour écraser et refuse quand même :

`mv : voulez-vous écraser « /etc/apt/preferences » en outrepassant le mode 0644 (rw-r--r--) ? o
mv: échec de déplacement inter-périphérique de « /home/ricardo/Documents/pref-relais » vers « /etc/apt/preferences » ; impossible de supprimer la cible: Permission non accordée
`

EDIT : je ne suis pas sur un autre périph mais sur le même système  
Je vais essayer avec /tmp

EDIT 2 :  
même rslt avec /tmp  
Ça m’emmerde de devoir changer les droits de preferences (0644).

---

<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, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/24 "2016-02-21T03:41:25Z")

</div>

```auto
Comme ça ?
```

Comme ça ?

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/25 "2016-02-21T03:41:26Z")

</div>

/tmp/apt-pref-relais && sudo mv /etc/apt-pref-relais  
???

EDIT, compris, je n’avais pas vu le second sudo.  
Je teste.

---

<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, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/26 "2016-02-21T03:41:26Z")

</div>

Un rattage :

```auto

```

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/27 "2016-02-21T03:41:26Z")

</div>

Bingo ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")  
T’es trop fort, je vais aller ramasser les feuilles, ça sera plus le domaine de mon neurone 😒  
 ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/28 "2016-02-21T03:41:26Z")

</div>

Ça serait probablement plus simple de mettre ça dans un script (que tu sauvegarderas par exemple dans /usr/local/bin) qui contienne tes commandes.  
Au moins, pas besoin de se rappeler les détails à chaque fois, et tu peux faire un sudo sur le script lui-même.

Et je soutiens la suggestion de MisterFreez, les constantes (ici, le n° de ligne) sont à éviter au maximum car un jour, c’est inévitable, elle va changer car tu éditeras ton fichier preferences… et tu auras complètement oublié d’éditer le script, ce qui foutra le bordel. Par contre contrairement à MisterFreez j’aurais plutôt tendance à fonctionner en prenant un point de repère fixe dans le fichier (est-ce que les blocs apt-listbugs font toujours 4 lignes ?).

[code]# cat \> /usr/local/bin/nettoyer-preferences-apt \<\<EOF  
#!/bin/sh

# Arrête le script à la moindre erreur, équivalent de commandes toutes enchaînées avec &&

set -e

# Récupérer le numéro de ligne à partir duquel faire le découpage

LIGNE="$(grep -n -m 1 -x ‘#### FIN DES PINNINGS PERSONNELS ####’ /etc/apt/preferences | cut -d : -f 1 -s)"

# Découper le fichier (on conserve la ligne trouvée, d’où le \<= au lieu de \< pour awk)

awk “NR\<=$LIGNE” /etc/apt/preferences \> /etc/apt/preferences.tmp

# Faire une sauvegarde au cas où (ça mange jamais de pain)

mv /etc/apt/preferences /etc/apt/preferences~

# Remplacer l’ancien preferences

mv /etc/apt/preferences.tmp /etc/apt/preferences  
EOF

# chmod +x /usr/local/bin/nettoyer-preferences-apt[/code]

Il ne reste plus qu’à rajouter le texte #### FIN DES PINNINGS PERSONNELS #### au bon endroit dans ton fichier /etc/apt/preferences, sachant que tout ce qui se trouve après sera systématiquement nettoyé à chaque utilisation du script.  
Ensuite, un simple sudo nettoyer-preferences-apt à chaque utilisation. 😉

---

<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, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/29 "2016-02-21T03:41:26Z")

</div>

Si je puis me permettre :  
[paste.isalo.org/78](http://paste.isalo.org/78)

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/30 "2016-02-21T03:41:26Z")

</div>

Sans le EOF final 😉  
[paste.isalo.org/79](http://paste.isalo.org/79)

---

<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, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/31 "2016-02-21T03:41:26Z")

</div>

Pourquoi persister à utiliser grep, cut et awk quand awk fait très bien l’affaire à lui tout seul ?  
De plus ma version utilise un fichier temporaire plus fiable et dans /tmp.

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/32 "2016-02-21T03:41:27Z")

</div>

> [@MisterFreez](#):
>
> Pourquoi persister à utiliser grep, cut et awk quand awk fait très bien l’affaire à lui tout seul ?

Tout simplement parce que je ne sais pas utiliser awk pour trouver le numéro de la ligne marqueur. 😉  
Si tu sais obtenir le même résultat avec une seule commande awk, n’hésite pas. ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

> [@MisterFreez](#):
>
> De plus ma version utilise un fichier temporaire plus fiable et dans /tmp.

Non, dans /tmp c’est beaucoup moins fiable :

[code]$ touch /tmp/foobar  
$ ll /tmp/foobar  
-rw------- 1 syam syam 0 2011-10-22 19:17 /tmp/foobar  
$ su  
Mot de passe :

# echo «&nbsp;contenu root&nbsp;» \> /tmp/foobar

# exit

$ ll /tmp/foobar  
-rw------- 1 syam syam 13 2011-10-22 19:17 /tmp/foobar  
$ echo «&nbsp;contenu pas fiable&nbsp;» \> /tmp/foobar  
$ cat /tmp/foobar  
contenu pas fiable  
$ su  
Mot de passe :

# touch /etc/apt/foobar

# ll /etc/apt/foobar

-rw-r–r-- 1 root root 0 2011-10-22 19:18 /etc/apt/foobar

# mv /tmp/foobar /etc/apt/foobar

# ll /etc/apt/foobar

-rw------- 1 syam syam 19 2011-10-22 19:18 /etc/apt/foobar

# exit

$ rm /etc/apt/foobar[/code]  
Même si tu fais un rm juste avant d’écrire initialement dans le fichier il y aura toujours une race condition qui fait que le fichier n’est pas fiable, et possiblement exploitable depuis n’importe quel programme qui tourne sur la machine. Dans /etc/apt/ au moins on n’a pas ce problème sachant qu’il est accessible à root uniquement.  
Mais la «&nbsp;bonne manière&nbsp;» de faire consiste évidemment à utiliser un nom de fichier temporaire fiable genre mktemp : [paste.isalo.org/80](http://paste.isalo.org/80) 😃

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/33 "2016-02-21T03:41:34Z")

</div>

[quote=“syam”]Ça serait probablement plus simple de mettre ça dans un script (que tu sauvegarderas par exemple dans /usr/local/bin) qui contienne tes commandes.  
Au moins, pas besoin de se rappeler les détails à chaque fois, et tu peux faire un sudo sur le script lui-même.[/quote]C’était bien envisagé comme ça, au début, je parle de mini-script.  
Et même, étant donné que je fais toujours une MAJ après mes sauvegardes hebdomadaires, je vais tout simplement rajouter ces lignes dans mon script de sauvegarde, à la fin, dans ma partie “perso”.

[quote=“syam”]  
Et je soutiens la suggestion de MisterFreez, les constantes (ici, le n° de ligne) sont à éviter au maximum car un jour, c’est inévitable, elle va changer car tu éditeras ton fichier preferences… et tu auras complètement oublié d’éditer le script, ce qui foutra le bordel. Par contre contrairement à MisterFreez j’aurais plutôt tendance à fonctionner en prenant un point de repère fixe dans le fichier (est-ce que les blocs apt-listbugs font toujours 4 lignes ?).[/quote]  
Le point fixe à trouver est simple avec une première ligne qui commence par “Explanation:”

```auto

```

réponse =  
55:Explanation: Pinned by apt-listbugs at Sat Oct 15 00:56:03 +0200 2011  
Ensuite, ce que je ne sais pas faire, c’est renvoyer les chiffrers de la réponse dans la commande (sous forme de variable ?)

`sudo awk "NR<54" /etc/apt/preferences > /etc/apt/pref-relais && sudo mv /etc/pref-relais /etc/apt/preferences
`  
Comme les “explanations” sont toujours ajoutées à la fin, je ne conserve que jusqu’à la ligne qui précède cette première occurrence de “Explanation:”

EDIT :  
il n’accepte pas la commande si ‘pref-relais’ est placé dans /etc/apt 😕  
Demain, je testerai en plaçant dans /home/ricardo

---

<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, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/34 "2016-02-21T03:41:35Z")

</div>

Saleté de moi, je me suis gouré de version dans le pastebin !  
Grrrrrrrrr

[paste.isalo.org/82](http://paste.isalo.org/82)

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/35 "2016-02-21T03:41:37Z")

</div>

Je ne comprends pas le système du pastbin, quel bloc faut-il copier, celui du bas ou celui du haut.  
Pourquoi deux blocs ?

EDIT : erreur ?  
cp -f “$ref” “$pref~”

ref ou pref ?

---

<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, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/36 "2016-02-21T03:41:38Z")

</div>

Le bloc du haut sert à présenter et le bloc du bas à copier, mais ils présentent la même chose.

Oui je suis allé vite (j’allais voir le match de rugby chez des amis) c’est pref

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/37 "2016-02-21T03:41:39Z")

</div>

> [@MisterFreez](#):
>
> `awk '/^Explanation:/{exit}{print $0}' "$pref" > "$tmpfile"`

Effectivement y’a pas photo, c’est beaucoup plus simple comme ça. 😃

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/38 "2016-02-21T03:41:40Z")

</div>

Je comprends presque tout le script mais il y a des trous et j’ai besoin d’un cours :

tmpfile=$(mktemp)  
je ne connaissais pas cette commande et j’ai lu le man mais ce que je ne comprend pas c’est $ devant, ça équivaut ptet aux `` ?

awk ‘/^Explanation:/{exit}{print $0}’ “$pref” \> "$tmpfile"  
pour la suite, si tu veux bien me détailler car c’est du Mandarin pour moi.  
ce que j’en comprends :  
awk cherche Explanation en début de ligne, je suppose qu’il démarre du début du fichier et s’arrête à la 1ère occurrence ?  
les // qui entourent Explanation: ???  
{exit}{print $0} ???

Le reste, je comprends : tout ce qui précède concerne le fichier $pref et envoie le résultat vers $tmpfile

---

<div class="post-metadata">

**Author:** ![syam](https://www.debian-fr.org/user_avatar/www.debian-fr.org/syam/32/2951_2.png) [@syam](https://www.debian-fr.org/u/syam)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/39 "2016-02-21T03:41:40Z")

</div>

[quote=“ricardo”]tmpfile=$(mktemp)  
je ne connaissais pas cette commande et j’ai lu le man mais ce que je ne comprend pas c’est $ devant, ça équivaut ptet aux `` ?[/quote]  
Oui la construction $(…) est équivalente à `...`  
Perso je trouve la première plus claire à relire, mais bon c’est avant tout une question de goûts. Et accessoirement, on peut imbriquer des $(… $(…) …) sans souci, alors que ce n’est pas faisable avec `...`

Pour awk je vais laisser MisterFreez répondre, là je nage autant que toi. 😃

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:41 UTC](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443/40 "2016-02-21T03:41:43Z")

</div>

Moi ce que je ne vois pas c’est l’endroit où se situe l’extraction du champ à supprimer ou la conservation du seul champ qui doit subsister :  
Dans l’ancienne ligne, il y avait :  
"NR\<54"  
Par quoi est-ce remplacé ?

EDIT :  
J’ai déjà une réponse partielle trouvée dans un mini-tuto awk :  
{print $0} = tous les champs (mais de quoi, la ligne, le paragraphe ???)

les // sont spécifique à awk, apparemment (en dehors de chemins et de la division)

[Page précédente](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443.md?page=1)

[Page suivante](https://www.debian-fr.org/t/recherches-ocurrences-dans-les-dernieres-lignes/34443.md?page=3)
