• Aucun résultat trouvé

Exécuter plusieurs commandes avec sudo sudo -s <<EOF

Dans le document Démarrer avec Bash (Page 120-123)

a='var'

echo 'Running serveral commands with sudo' mktemp -d

echo "\$a" EOF

$a doit être échappé pour empêcher son extension par le shell actuel •

Ou

sudo -s <<'EOF' a='var'

echo 'Running serveral commands with sudo' mktemp -d

echo "$a" EOF

Lire Ici des documents et ici des cordes en ligne: https://riptutorial.com/fr/bash/topic/655/ici-des-documents-et-ici-des-cordes

Chapitre 32: La commande de coupe

Introduction

La commande cut est un moyen rapide d'extraire des parties de lignes de fichiers texte. Il

appartient aux plus anciennes commandes Unix. Ses implémentations les plus populaires sont la version GNU trouvée sur Linux et la version FreeBSD disponible sur MacOS, mais chaque version d'Unix a la sienne. Voir ci-dessous pour les différences. Les lignes d'entrée sont lues à partir de

stdin ou de fichiers répertoriés comme arguments sur la ligne de commande.

Syntaxe

cut -f1,3 # extrait le premier et le troisième champ délimité par des tabulations (à partir de stdin)

cut -f1-3 # extrait du premier au troisième champ (extrémités incluses)

cut -f-3 # -3 est interprété comme 1-3 •

cut -f2- # 2 est interprété de la seconde au dernier

cut -c1-5,10 # extrait de stdin les personnages dans les positions 1,2,3,4,5,10

cut -s -f1 # supprime les lignes ne contenant pas de délimiteurs •

cut --complement -f3 # (coupe GNU uniquement) extrait tous les champs sauf le troisième

Paramètres

Paramètre Détails

-f, --fields Sélection par champs

-d, --delimiter Délimiteur pour la sélection par champs

-c, --characters Sélection basée sur les caractères, délimiteur ignoré ou erreur -s, - uniquement

délimité

Supprimer les lignes sans caractère de délimitation (imprimé tel quel)

--complément Sélection inversée (extraire tout sauf les champs / caractères spécifiés

Remarques

1. Différences de syntaxe

Les options longues du tableau ci-dessus ne sont prises en charge que par la version GNU.

2. Aucun personnage ne bénéficie d'un traitement spécial

FreeBSD cut (fourni avec MacOS, par exemple) ne possède pas le commutateur --complement et, dans le cas des plages de caractères, on peut utiliser la commande colrm place:

$ cut --complement -c3-5 <<<"123456789" 126789

$ colrm 3 5 <<<"123456789" 126789

Cependant, il y a une grande différence, car colrm traite les caractères TAB (ASCII 9) comme des tabulations réelles jusqu'au multiple de huit suivant, et les backspaces (ASCII 8) de -1; au

contraire, cut traite tous les caractères comme une colonne de large.

$ colrm 3 8 <<<$'12\tABCDEF' # Input string has an embedded TAB 12ABCDEF

$ cut --complement -c3-8 <<<$'12\tABCDEF' 12F

3. (Toujours pas) l'internationalisation

Lorsque la cut été conçue, tous les caractères duraient un octet et l’internationalisation n’était pas un problème. Lorsque les systèmes d’écriture avec des caractères plus larges sont devenus populaires, la solution adoptée par POSIX consistait à distinguer l’ancien commutateur -c , qui devrait conserver son sens de la sélection des caractères, peu importe le nombre d’octets, et introduire un nouveau commutateur -b sélectionnez des octets, quel que soit le codage de caractères actuel. Dans les implémentations les plus courantes, -b été introduit et fonctionne, mais -c fonctionne toujours exactement comme -b et pas comme il le devrait. Par exemple avec GNU cut :

Il semble que le filtre anti-spam de SE liste les textes anglais avec des caractères kanji isolés. Je ne pouvais pas surmonter cette limitation, alors les exemples suivants sont moins expressifs qu'ils pourraient l'être.

# In an encoding where each character in the input string is three bytes wide, # Selecting bytes 1-6 yields the first two characters (correct)

$ LC_ALL=ja_JP.UTF-8 cut -b1-6 kanji.utf-8.txt ...first two characters of each line...

# Selecting all three characters with the -c switch doesn’t work. # It behaves like -b, contrary to documentation.

$ LC_ALL=ja_JP.UTF-8 cut -c1-3 kanji.utf-8.txt ...first character of each line...

# In this case, an illegal UTF-8 string is produced. # The -n switch would prevent this, if implemented. $ LC_ALL=ja_JP.UTF-8 cut -n -c2 kanji.utf-8.txt ...second byte, which is an illegal UTF-8 sequence...

Si vos personnages sont en dehors de la plage ASCII et que vous voulez utiliser cut , vous devez toujours être au courant de la largeur des caractères dans l' encodage et utilisez -b en

conséquence. Si et quand -c commence à fonctionner comme documenté, vous n'aurez pas à modifier vos scripts.

4. Comparaisons de vitesse

Les restrictions de cut ont des doutes sur son utilité. En fait, les mêmes fonctionnalités peuvent être obtenues par des utilitaires plus puissants et plus populaires. Cependant, l'avantage de la cut

est sa performance . Voir ci-dessous pour des comparaisons de vitesse. test.txt a trois millions de lignes, chacune contenant cinq champs séparés par des espaces. Pour le test awk , mawk été utilisé, car il est plus rapide que GNU awk . Le shell lui-même (dernière ligne) est de loin le moins performant. Les temps donnés (en secondes) sont ce que la commande de time donne en temps

réel .

(Juste pour éviter les malentendus: toutes les commandes testées donnaient la même sortie avec l'entrée donnée, mais elles ne sont bien sûr pas équivalentes et donneraient des sorties différentes dans des situations différentes, notamment si les champs étaient délimités par un nombre variable d'espaces)

Commander Temps

cut -d ' ' -f1,2 test.txt 1.138s

awk '{print $1 $2}' test.txt 1.688s

join -a1 -o1.1,1.2 test.txt /dev/null 1.767s

perl -lane 'print "@F[1,2]"' test.txt 11.390s

grep -o '^\([^ ]*\) \([^ ]*\)' test.txt 22.925s

sed -e 's/^\([^ ]*\) \([^ ]*\).*$/\1 \2/' test.txt 52.122s

while read ab _; do echo $a $b; done <test.txt 55.582s

5. Pages de manuel référentielles

Groupe ouvert • GNOU • FreeBSD •

Examples

Dans le document Démarrer avec Bash (Page 120-123)

Documents relatifs