Si vous aidiez quelqu'un à apprendre le concept des pipes sur la ligne de commande, quel exemple utiliseriez-vous? L’exemple qui a été cité est le suivant:
cat whatever.txt | less
J'ai l'impression que ce n'est pas le meilleur exemple, à savoir parce qu'il n'y a qu'un pas. Qu'est-ce qu'un bon usage, mais fondamental |
?
Idéalement, l'exemple que je vais présenter utilisera des programmes dont les sorties elles-mêmes peuvent être exécutées indépendamment, puis affichées ensemble.
command-line
pipe
Matthieu
la source
la source
cat
de cela car celaless whatever.txt
fonctionne très bien.Réponses:
Je vais vous montrer un exemple un peu complexe, basé sur un scénario réel.
Problème
Disons que la commande a
conky
cessé de répondre sur mon bureau et que je veux la tuer manuellement. Je connais un peu Unix, donc je sais que ce que je dois faire, c'est exécuter la commandekill <PID>
. Pour récupérer le PID, je peux utiliserps
outop
ou tout autre outil ma distribution Unix m'a donné. Mais comment puis-je faire cela en une seule commande?Répondre
DISCLAIMER: Cette commande ne fonctionne que dans certains cas. Ne le copiez / collez pas dans votre terminal et ne commencez pas à l’utiliser, cela pourrait tuer des processus sans le savoir Apprenez plutôt comment le construire .
Comment ça marche
1-
ps aux
Cette commande affichera la liste des processus en cours et des informations les concernant. L'information intéressante est qu'il va sortir le PID de chaque processus dans sa 2e colonne. Voici un extrait de la sortie de la commande sur ma boîte:
2-
grep conky
Je ne suis intéressé que par un processus, je
grep
recherche donc l'entrée correspondant à mon programmeconky
.3-
grep -v grep
Comme vous pouvez le constater à l'étape 2, la commande
ps
affiche legrep conky
processus dans sa liste (c'est un processus en cours d'exécution). Pour le filtrer, je peux courirgrep -v grep
. L'option-v
indique degrep
faire correspondre toutes les lignes à l' exclusion de celles contenant le motif.NB: J'aimerais savoir comment faire les étapes 2 et 3 en un seul
grep
appel.4-
awk '{print $2}'
Maintenant que j'ai isolé mon processus cible. Je veux récupérer son PID. En d'autres termes, je veux récupérer le deuxième mot de la sortie. Heureusement pour moi, la plupart (tous?) Les ordinateurs modernes fourniront une version de
awk
, un langage de script qui fait des merveilles avec des données tabulaires. Notre tâche devient aussi facile queprint $2
.5-
xargs kill
J'ai le PID. Tout ce dont j'ai besoin est de le transmettre
kill
. Pour ce faire, je vais utiliserxargs
.xargs kill
lit à partir de l'entrée (dans notre cas à partir du tube), forme une commande composée dekill <items>
(<items>
est ce qu'il lit à partir de l'entrée), puis exécute la commande créée. Dans notre cas, il va exécuterkill 1948
. Mission accomplie.Mots finaux
Notez que, selon la version de votre système d'exploitation Unix utilisée, certains programmes peuvent se comporter légèrement différemment (par exemple,
ps
le PID peut être généré dans la colonne $ 3). Si quelque chose semble faux ou différent, lisez la documentation de votre fournisseur (ou mieux, lesman
pages). Faites également attention car de longs tuyaux peuvent être dangereux. Ne faites pas de suppositions, en particulier lorsque vous utilisez des commandes telles quekill
ourm
. Par exemple, s'il y avait un autre utilisateur nommé 'conky' (ou 'Aconkyous'), ma commande pourrait également tuer tous ses processus en cours d'exécution!Ce que je dis, c'est de faire attention, surtout pour les longues pipes. Il est toujours préférable de le construire de manière interactive comme nous l'avons fait ici, plutôt que de formuler des hypothèses et de vous sentir désolé plus tard.
la source
kill $(pgrep conky)
pkill conky
grep
appel.grep [c]onky
est ce que vous cherchez.Mon préféré est celui-ci:
youtube-dl $1 -q -o - | ffmpeg -i - $2
télécharge une vidéo à partir de l’URL youtube donnée passée
$1
et l’affiche sous forme de fichier donné par$2
. Notez que le fichier est sorti en mode silencieux-q
vers STDOUT-o -
, transmis à ffmpeg et utilisé comme entrée par celui-ci-i -
.Cela pourrait être un exemple pratique, en particulier pour les débutants sous Linux, des raisons pour lesquelles la ligne de commande peut être utile et simplifier les choses plutôt que d'utiliser des outils graphiques. Je ne sais pas combien de temps il faudrait pour télécharger une vidéo à partir de youtube et convertir son son en mp3. La ligne ci-dessus peut le faire en quelques secondes.
la source
youtube-dl --extract-audio --audio-format mp3 -a -
. Encore un bon exemple, mais il existe des moyens plus simples de le faire. (Il appelle ffmpeg en interne.)youtube-dl $1 -q -o - | mplayer -
joue directement la vidéo dans mplayer. J'utilise cette commande de mon ordinateur portable pour dire à mon serveur (qui est connecté au téléviseur) de lire des vidéos. Je dois ajouter-display :0.0 -geometry 400x300+1200+200
pour que la fenêtre mplayer apparaisse sur le bon écran.L’utilisation générale (lire: la façon dont je l’utilise la plupart du temps) correspond au moment où, pour une raison quelconque, je dois exécuter des données à travers plusieurs outils pour effectuer différentes tâches de traitement.
Je dirais donc que l’ utilisation de tuyaux est comme une colle pour assembler plusieurs blocs de construction (les différents outils UNIX). Comme Ulrich a dit,
sort
etuniq
est une strophe commune.Selon le public cible, si vous souhaitez mettre en évidence cette utilisation des pipes, vous pouvez par exemple commencer par: "hé, ce programme contient des liens vers plusieurs PDF intéressants avec des papiers et des notes de cours, mais certaines d'entre elles sont répétées. en quelque sorte automatiser cela? "
Ensuite, vous pouvez montrer comment
lynx --dump --listonly
obtient la liste des liens, commentgrep
filtrer les liens se terminant par.pdf
,colrm
oused
supprimer les numéroslynx
laissés sur chaque URL, commentsort
et commentuniq
supprimer les doublons, et enfin, commentwget -i -
récupérer les fichiers (en utilisant--wait
être doux sur le serveur, bien sûr).Je crains que ce soit un exemple complexe. D'autre part, il peut être utile de montrer la puissance des tuyaux lorsque vous le faites simplement et que le shell le fait fonctionner en même temps.
la source
sort -u
dans GNU coreutils aussi.Je ne sais pas exactement à propos de bien, mais passe à travers
grep
doit être l’une des utilisations les plus courantes, éventuellement suivie dewc -l
. (Oui,grep
l'-c
interrupteur peu connu .)Une autre strophe courante est
| sort | uniq
, ne serait-ce que parceuniq
que son entrée doit être triée.la source
... | sort -u
si disponible!Non pas que vous en ayez besoin pour cet exemple, mais:
... inverser l'ordre des greps préserve la colorisation, mais BEAUCOUP moins efficace. vraisemblablement sur de grandes listes, la couleur n'aurait pas d'importance.
De plus, cette page Web suggère:
https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep
... mais cela ne fonctionnera pas si vous recherchez une seule lettre (comme le processus 'X').
la source
J'ai enfin l'occasion de partager ce gâchis d'un film que j'ai fabriqué il y a environ un an et demi ...
Il...
Cela aurait pu être beaucoup mieux fait avec un seul script Python, je parie.
la source
C'est la première chose qui m'est venue à l'esprit ...
mysqldump
est une application console qui envoie des données, un schéma et éventuellement des procédures et des fonctions à stdout. Habituellement, il est redirigé vers un fichier pour la sauvegarde.mysqldump <options> > mydb.dump
Cela vous donnerait un script SQL non compressé. Pour économiser de l'espace, vous pouvez le compresser avec bzip2.
bzip2 mydb.dump
Alternativement, vous pouvez faire les deux en une étape:
mysqldump <options> | bzip2 > mydb.dump.bz2
Dans cet exemple ci-dessus, le stdout de
mysqldump
est envoyé à bzip2 qui redirige ensuite sa sortie vers un fichier.la source
bzcat mydb.dump.bz2 | mysql <options>
.Voici un exemple que j'utilise dans mon travail pour plusieurs canaux en une seule commande. Cela utilise gawk pour rechercher le journal de requête général de MySQL ($ OFILE) et trouver toutes les connexions refusées. Il trie ensuite cette liste par nom, transmet cette liste à uniq qui compte les occurrences, puis trie une dernière fois la liste comptée ...
la source
Les tuyaux fonctionnent mieux avec des filtres et des traducteurs
De cette façon, les données peuvent circuler d'un programme à un autre en mémoire tampon et à aucun moment toutes les données ne doivent être en mémoire en même temps.
la source
cat filename | less
est une utilisation terrible de la tuyauterie puisque vous pouvez simplement faireless filename
Voici un exemple de pépins que j'utilise tous les jours (mais cela peut aussi être un mauvais exemple):
ls -la | more -c
Les réponses de Scott Hoffman et NJSG en sont de meilleurs exemples.
la source
Que diriez-vous de: recherche de motif et affichage du dernier motif?
Montre comment utiliser
tail
,sed
etgrep
dans un contexte de conduite qui peut être construit étape par étape.la source
exécutez celui-ci dans le répertoire de votre choix pour analyser la taille du dossier (puis faites défiler vers le bas avec la touche FIN):
Sortiert nach Ordnergrösse
la source
Voici un exemple que j'ai utilisé pour définir la variable DISPLAY alors que xauth n'était pas une option ...
La première commande récupère les données nécessaires, c'est-à-dire le nom d'hôte ou l'adresse IP. La deuxième commande récupère uniquement ces données (dernier champ). Enfin, la dernière commande supprime les parenthèses des données.
la source
La tuyauterie de commande que vous pouvez utiliser n’importe où, selon vous, la sortie de la première commande peut être transmise en entrée.
Exemples.
exemple de chat txt | grep {une_ligne} | awk {une_commande}
C'est simplement le concept que si vous sentez que la sortie de commande que vous avez exécutée peut être entrée d'une autre commande, vous pouvez la diriger.
la source