Les exemples les plus puissants de commandes ou de scripts Unix que tout programmeur doit connaître

Il y a beaucoup de choses que tous les programmeurs devraient savoir, mais je suis particulièrement intéressé par les commandes Unix / Linux que nous devrions tous connaître. Pour accomplir des tâches que nous pourrions rencontrer à un moment donné, telles que la refactorisation , la création de rapports , les mises à jour du réseau , etc.

La raison pour laquelle je suis curieux est d’avoir déjà travaillé en tant que testeur de logiciels dans une société de logiciels alors que j’étudiais mon diplôme. J’ai remarqué que tous les développeurs (qui développaient des logiciels Windows) avaient 2 ordinateurs.

À leur gauche se trouvait leur machine de développement Windows XP, et à droite une machine Linux. Je pense que c’était Ubuntu. Quoi qu’il en soit, ils m’ont dit qu’ils l’utilisaient parce qu’il fournissait de puissantes opérations Unix que Windows ne pouvait pas faire dans leur processus de développement.

Cela me rend curieux de savoir, en tant qu’ingénieur logiciel, quels sont, selon vous, les scripts / commandes / utilisations les plus puissants que vous pouvez exécuter sur un système d’exploitation Unix / Linux que tout programmeur doit connaître pour résoudre des tâches réelles nécessairement lié à l’écriture de code?

Nous soaps tous ce que font sed , awk et grep . Je m’intéresse à certains éléments de script Unix / Linux réels qui ont résolu un problème difficile pour vous, afin que d’autres programmeurs puissent en bénéficier. Veuillez fournir votre histoire et votre source.

Je suis sûr qu’il y a de nombreux exemples comme celui-ci que les gens gardent dans leur dossier « Scripts ».

Mise à jour: Les gens semblent mal interpréter la question. Je ne vous demande pas les noms des commandes unix individuelles, mais plutôt des extraits de code UNIX qui ont résolu un problème pour vous.

Meilleures réponses de la communauté


Parcourez une arborescence de répertoires et imprimez les chemins d’access aux fichiers correspondant à une expression régulière:

find . -exec grep -l -e 'myregex' {} \; >> outfile.txt 

Invoquer l’éditeur par défaut (Nano / ViM)

(Fonctionne sur la plupart des systèmes Unix, y compris Mac OS X) L’éditeur par défaut correspond à la valeur de votre variable d’environnement ” EDITOR “. ie: export EDITOR = / usr / bin / pico qui se trouve dans ~ / .profile sous Mac OS X.

 Ctrl+x Ctrl+e 

Liste de toutes les connexions réseau en cours d’exécution (y compris l’application à laquelle elles appartiennent)

 lsof -i -nP 

Effacer l’historique de recherche du terminal (un autre de mes favoris)

 history -c 

Je trouve que commandlinefu.com est une excellente ressource pour diverses recettes de scripts shell.

Exemples

Commun

 # Run the last command as root sudo !! # Rapidly invoke an editor to write a long, complex, or sortingcky command ctrl-x ctrl-e # Execute a command at a given time echo "ls -l" | at midnight 

Ésotérique

 # output your microphone to a remote computer's speaker dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp 

Comment sortir de VI

: wq

Enregistre le fichier et met fin à la misère.

Une alternative à ” :wq ” est ” :x ” pour sauvegarder et fermer l’éditeur vi.

  • grep
  • awk
  • sed
  • perl
  • trouver

Une grande partie du pouvoir Unix provient de sa capacité à manipuler des fichiers texte et à filtrer des données. Bien sûr, vous pouvez obtenir toutes ces commandes pour Windows. Ils ne sont tout simplement pas natifs dans le système d’exploitation, comme s’ils étaient sous Unix.

et la possibilité d’enchaîner les commandes avec des tubes, etc. Cela peut créer des lignes de commandes extrêmement puissantes à partir de fonctions simples.

Votre shell est l’outil le plus puissant dont vous disposez

  1. être capable d’écrire des boucles simples, etc.
  2. comprendre la globalisation des fichiers (par exemple, * .java, etc.)
  3. être capable de rassembler des commandes via des tuyaux, des sous-couches. redirection etc.

Avoir ce niveau de connaissance du shell vous permet de faire d’énormes quantités sur la ligne de commande, sans avoir à enregistrer des informations via des fichiers texte temporaires, copier / coller, etc., et à tirer parti du grand nombre de programmes utilitaires .

Unix Power Tools vous en montrera beaucoup. Chaque fois que j’ouvre ma copie, je trouve quelque chose de nouveau.

Je l’utilise tellement que j’ai vraiment honte de moi. Supprimez les espaces de tous les noms de fichiers et remplacez-les par un trait de soulignement:

[removespaces.sh]

 #!/bin/bash find . -type f -name "* *" | while read file do mv "$file" "${file// /_}" done 

Mon favori personnel est la commande lsof.

“lsof” peut être utilisé pour lister les descripteurs de fichiers ouverts, les sockets et les pipes. Je trouve cela extrêmement utile lorsque vous essayez de déterminer quels processus ont utilisé quels ports / fichiers sur ma machine.

Exemple: Répertorie toutes les connexions Internet sans résolution de nom d’hôte et sans conversion de nom de port en port.

 lsof -i -nP 

http://www.manpagez.com/man/8/lsof/

Si vous faites une faute de frappe dans une longue commande, vous pouvez réexécuter la commande avec une substitution (en bash):

 mkdir ~/aewseomeDirectory 

vous pouvez voir que “awesome” est mal écrit, vous pouvez taper ce qui suit pour relancer la commande avec la faute de frappe corrigée

 ^aew^awe 

il produit alors ce qu’il a substitué (mkdir ~/aweseomeDirectory ) et exécute la commande. (N’oubliez pas de réparer les dégâts que vous avez causés avec la commande incorrecte!)

La commande tr est la commande la moins appréciée sous Unix:

 #Convert all input to upper case ls | tr az AZ #take the output and put into a single line ls | tr "\n" " " #get rid of all numbers ls -lt | tr -d 0-9 

Lors de la résolution de problèmes sur des boîtes Linux défectueuses, la séquence de touches la plus courante que je tape se termine en tapant: alt + sysrq REISUB

La puissance de ces outils (grep find, awk, sed) vient de leur polyvalence, donc donner un cas particulier semble tout à fait inutile.

man est le plus puissant, car vous pouvez alors comprendre ce que vous tapez au lieu de copier aveuglément le copier-coller depuis le débordement de la stack.

Les exemples sont les bienvenus, mais il y a déjà des sujets pour cette question. Mon plus utilisé:

 grep something_to_find * -R 

qui peut être remplacé par ack et

 find | xargs 

trouver avec les résultats canalisés dans xargs peut être très puissant

Certains d’entre vous peuvent ne pas être d’accord avec moi, mais néanmoins, voici de quoi parler. Si l’on apprend gawk (d’autres variantes également), on peut ignorer l’apprentissage et utiliser grep / sed / wc / cut / paste et quelques autres outils * nix. tout ce dont vous avez besoin est un bon outil pour faire le travail de plusieurs personnes.

Une certaine manière de rechercher (plusieurs) fichiers journaux mal formatés, dans lesquels la chaîne de recherche peut être trouvée sur une ligne suivante “orpheline”. Par exemple, pour afficher à la fois la 1ère et la 3ème et 4ème lignes concaténées lors de la recherche de id = 110375:

 [2008-11-08 07:07:01] [INFO] ...; id = 110375; ... [2008-11-08 07:07:02] [INFO] ...; id = 238998; ... [2008-11-08 07:07:03] [ERROR] ... caught exception ...; id = 110375; ... [2008-11-08 07:07:05] [INFO] ...; id = 800612; ... 

Je suppose qu’il doit y avoir de meilleures solutions ( oui, ajoutez-les …! ) Que la concaténation suivante des deux lignes utilisant sed avant d’exécuter grep :

 #!/bin/bash if [ $# -ne 1 ] then echo "Usage: `basename $0` id" echo "Searches all myproject's logs for the given id" exit -1 fi # When finding "caught exception" then append the next line into the pattern # space bij using "N", and next replace the newline with a colon and a space # to ensure a single line starting with a timestamp, to allow for sorting # the output of multiple files: ls -rt /var/www/rails/myproject/shared/log/production.* \ | xargs cat | sed '/caught exception$/N;s/\n/: /g' \ | grep "id = $1" | sort 

…produire:

 [2008-11-08 07:07:01] [INFO] ...; id = 110375; ... [2008-11-08 07:07:03] [ERROR] ... caught exception: ...; id = 110375; ... 

En fait, une solution plus générique appendait toutes les lignes (éventuellement multiples) qui ne commencent pas par [timestamp] à sa ligne précédente. N’importe qui? Sans nécessairement utiliser sed , bien sûr.

 for card in `seq 1 8` ;do for ts in `seq 1 31` ; do echo $card $ts >>/etc/tuni.cfg; done done 

était mieux que d’écrire les 248 lignes stupides de config à la main.

Neded à laisser tomber certaines tables qui ont toutes été préfixées avec ‘tmp’

 for table in `echo show tables | mysql quotiadb |grep ^tmp` ; do echo drop table $table done 

Examinez la sortie, réexécutez la boucle et dirigez-la vers mysql

Trouver des PID sans que le grep lui-même apparaisse

 export CUPSPID=`ps -ef | grep cups | grep -v grep | awk '{print $2;}'` 

Meilleures réponses de la communauté


Parcourez une arborescence de répertoires et imprimez les chemins d’access aux fichiers correspondant à une expression régulière:

 find . -exec grep -l -e 'myregex' {} \; >> outfile.txt 

Invoquer l’éditeur par défaut (Nano / ViM)

(fonctionne avec la plupart des systèmes Unix, y compris Mac OS X) ie: export EDITOR = / usr / bin / pico qui se trouve dans ~ / .profile sous Mac OS X.

 Ctrl+x Ctrl+e 

Liste de toutes les connexions réseau en cours d’exécution (y compris l’application à laquelle elles appartiennent)

 lsof -i -nP 

Effacer l’historique de recherche du terminal (un autre de mes favoris)

 history -c 

Grep (essayez Windows Grep )

sed (essayez Sed pour Windows)

En fait, il existe un grand ensemble de ports de commandes * nix vraiment utiles disponibles sur http://gnuwin32.sourceforge.net/ . Si vous avez un arrière-plan * nix et utilisez maintenant Windows, vous devriez probablement les vérifier.

Vous feriez mieux si vous gardez une feuille de sortingche avec vous … il n’y a pas une seule commande qui puisse être qualifiée de très utile. Si une commande spécifique est utile, votre travail est puissant

Modifier vous voulez des scripts shell puissants? les scripts shell sont des programmes. Obtenez les bases, construisez sur des commandes individuelles et vous obtiendrez ce qu’on appelle un script puissant. Celui qui sert votre besoin est puissant sinon il est inutile. Il aurait été préférable que vous ayez mentionné un problème et demandé comment le résoudre.

Une sorte de réserve, mais vous pouvez obtenir des PowerShell sur Windows. Son vraiment puissant et peut faire beaucoup de choses de type * nix. Une différence intéressante est que vous travaillez avec des objects .net au lieu du texte, ce qui peut être utile si vous utilisez le pipeline pour le filtrage, etc.

Sinon, si vous n’avez pas besoin de l’intégration .NET, installez Cygwin dans la boîte Windows. (Et ajoutez son répertoire au Windows PATH.)

Le fait que vous puissiez utiliser -name et -iname plusieurs fois dans une commande find m’a ouvert les yeux.

[findplaysong.sh]

 #!/bin/bash cd ~ echo Matched... find /home/musicuser/Music/ -type f -iname "*$1*" -iname "*$2*" -exec echo {} \; echo Sleeping 5 seconds sleep 5 find /home/musicuser/Music/ -type f -iname "*$1*" -iname "*$2*" -exec mplayer {} \; exit 

Lorsque les choses fonctionnent sur un serveur mais sont cassées sur un autre, ce qui suit vous permet de comparer toutes les bibliothèques associées:

 export MYLIST=`ldd amule | awk ' { print $3; }'`; for a in $MYLIST; do cksum $a; done 

Comparez cette liste avec celle entre les machines et vous pouvez isoler rapidement les différences.

Pour exécuter en parallèle plusieurs processus sans trop surcharger la machine (dans une architecture multiprocesseur):

 NP=`cat /proc/cpuinfo | grep processor | wc -l` #your loop here if [ `jobs | wc -l` -gt $NP ]; then wait fi launch_your_task_in_background& #finish your loop here 

Démarrer tous les services Web

  find -iname '*weservice*'|xargs -I {} service {} restart 

Rechercher une classe locale dans le sous-répertoire java

  find -iname '*.java'|xargs grep 'class Pool' 

Trouvez tous les éléments du fichier de manière récursive dans les sous-répertoires du chemin actuel:

  cat searches.txt| xargs -I {} -d, -n 1 grep -r {} 

PS search.txt: premier, deuxième, troisième, …, million

 :() { :|: &} ;: 

Fork Bomb sans access root.

Essayez-le à vos risques et périls.

Répétez votre commande précédente en bash en utilisant !! . chown otheruser: -R /home/otheruser souvent chown otheruser: -R /home/otheruser et oublie d’utiliser sudo. Si vous oubliez le sudo, utilisez !! est un peu plus facile que la flèche vers le haut et puis à la maison.

 sudo !! 

Je ne suis pas non plus un fan des noms d’hôte et des noms résolus automatiquement pour les ports, donc je garde un alias pour iptables mappé sur iptables -nL --line-numbers . Je ne sais même pas pourquoi les numéros de ligne sont masqués par défaut.

Enfin, si vous voulez vérifier si un processus écoute sur un port comme il se doit, lié à la bonne adresse, vous pouvez exécuter

 netstat -nlp 

Ensuite, vous pouvez grep le nom du processus ou le numéro de port (-n vous donne un numéro numérique).

J’aime aussi avoir l’aide de couleurs dans le terminal. J’aime append ceci à mes bashrc pour me rappeler si je suis root sans même avoir à le lire. Cela m’a beaucoup aidé, je n’oublie plus jamais le sudo.

 red='\033[1;31m' green='\033[1;32m' none='\033[0m' if [ $(id -u) -eq 0 ]; then PS1="[\[$red\]\u\[$none\]@\H \w]$ " else PS1="[\[$green\]\u\[$none\]@\H \w]$ " fi 

Ce sont toutes des commandes très simples, mais je les utilise beaucoup. La plupart d’entre eux méritaient même un alias sur mes machines.

Vous pouvez faire n’importe quoi avec ça …

gcc