web-dev-qa-db-fra.com

Exemples les plus puissants de commandes ou de scripts Unix que tout programmeur devrait connaître

Tous les programmeurs doivent savoir beaucoup de choses, 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 refactoring , reporting , mises à jour du réseau etc.

La raison pour laquelle je suis curieux est qu’ayant déjà travaillé en tant que testeur de logiciels dans une entreprise de logiciels alors que j’étudiais mon diplôme, j’ai remarqué que tous les développeurs (qui développaient des logiciels Windows) possédaient deux ordinateurs.

À leur gauche, 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 des opérations unix puissantes que Windows ne pouvait pas effectuer dans leur processus de développement.

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

Nous savons tous ce que sed , awk et grep do. Je suis intéressé par certains scripts 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 existe de nombreux exemples comme celui-ci que les gens conservent dans leur dossier ' Scripts '.

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

Meilleures réponses de la communauté


Parcourez une arborescence de répertoires et imprimez des chemins d'accès aux fichiers correspondant à une expression régulière:

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

Invoque 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 variable d'environnement [.____. ""EDITOR"définie sur . c'est-à-dire: export EDITOR =/usr/bin/pico qui est situé dans ~/.profile sous Mac OS X.

Ctrl+x Ctrl+e

Répertorie 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
27
Brock Woolf

Meilleures réponses de la communauté


Parcourez une arborescence de répertoires et imprimez des chemins d'accès aux fichiers correspondant à une expression régulière:

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

Invoque 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 variable d'environnement [.____. ""EDITOR"définie sur . c'est-à-dire: export EDITOR =/usr/bin/pico qui est situé dans ~/.profile sous Mac OS X.

Ctrl+x Ctrl+e

Répertorie 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
1
Brock Woolf

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 tricky 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
19
Alex B

Comment quitter VI

: wq

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

La variante de ":wq" est ":x" pour enregistrer et fermer l'éditeur vi.

13
quant_dev
  • grep 
  • awk 
  • sed 
  • Perl 
  • trouver

Unix tire sa puissance 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 ils le sont sous Unix. 

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

8
Xetius

Votre Shell est l'outil le plus puissant dont vous disposez

  1. être capable d'écrire des boucles simples, etc.
  2. compréhension de la lecture de fichiers (par exemple * .Java, etc.)
  3. être capable de mettre en place des commandes via des pipes, des sous-coques. redirection etc.

Avoir ce niveau de connaissances sur Shell vous permet de faire d’énormes quantités en ligne de commande, sans avoir à enregistrer des informations via des fichiers texte temporaires, des copier/coller, etc., et à exploiter le grand nombre de programmes utilitaires qui permettent de couper/découper des données. .

Unix Power Tools vous en montrera une grande partie. Chaque fois que j'ouvre ma copie, je trouve quelque chose de nouveau.

4
Brian Agnew

J'utilise tellement cela que j'ai vraiment honte de moi-même. 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
4
ojblass

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

mkdir ~/aewseomeDirectory

vous pouvez voir que "awesome" est mal orthographié, vous pouvez taper ce qui suit pour relancer la commande avec la typo corrigée

^aew^awe

il affiche ensuite ce qu'il a remplacé par (mkdir ~/aweseomeDirectory) et exécute la commande. (N'oubliez pas de réparer les dégâts que vous avez causés avec une commande incorrecte!)

3
micmoo

Mon préféré 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 d'essayer de déterminer quels processus ont utilisé quels ports/fichiers sur ma machine.

Exemple: Répertoriez 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/

3
coderjoe

La commandetrest la commande la plus sous-estimée sous Unix:

#Convert all input to upper case
ls | tr a-z A-Z

#take the output and put into a single line 
ls | tr  "\n" " "

#get rid of all numbers
ls -lt | tr -d 0-9
2
ojblass
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 à la main les 248 lignes de configuration stupides.

Neded pour laisser tomber quelques tables restantes 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

Vérifiez le résultat, relancez la boucle et dirigez-la vers mysql

1
nos

Un moyen de rechercher (plusieurs) fichiers journaux mal formatés, dans lesquels la chaîne de recherche peut être trouvée sur une ligne "orpheline". Par exemple, pour afficher à la fois la 1ère et les 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; ...

J'imagine qu'il doit y avoir de meilleures solutions ( oui, ajoutez-les ...! ) à la concaténation suivante des deux lignes utilisant sed avant d'exécuter réellement 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 ajouterait toutes les lignes (éventuellement plusieurs) qui ne commencent pas par un [horodatage] à la ligne précédente. N'importe qui? Pas nécessairement en utilisant sed, bien sûr.

1
Arjan

certains d'entre vous peuvent être en désaccord avec moi, mais néanmoins, voici quelque chose à discuter. Si on apprend gawk (d'autres variantes également) complètement, 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 combinés. 

1
ghostdog74

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 est celle de taper jusqu'à alt + sysrq R E I S U B

1
Simon P Stevens

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

man est la commande la plus puissante, car vous pouvez alors comprendre ce que vous tapez au lieu de simplement copier aveuglément un collage à partir d’un débordement de pile.

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

grep something_to_find * -R

qui peut être remplacé par ack et

find | xargs 

trouver avec des résultats diffusés dans xargs peut être très puissant

1
shodanex

Trouver des PID sans que le grep ne se présente

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

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

Sudo !!

Je ne suis pas non plus un fan des noms d’hôte résolus automatiquement et des noms de ports, je conserve donc 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 comme il se doit sur un port, vous pouvez exécuter la liaison à la bonne adresse.

netstat -nlp

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

J'aime aussi avoir l'aide de couleurs dans le terminal. J'aime ajouter ceci à mon bas pour me rappeler si je suis root sans même avoir à le lire. En fait, cela m'a beaucoup aidé, je n'oublie plus 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.

0
Time Sheep

Un peu de côté, mais vous pouvez avoir PowerShell sur Windows. C'est vraiment puissant et peut faire beaucoup de choses de type * nix. Une différence intéressante est que vous travaillez avec des objets .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 sur Windows. (Et ajoutez son répertoire au PATH Windows.)

0
Dave Archer

Démarrer tous les WebService (s)

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

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

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

Trouver tous les articles du fichier récursivement dans les sous-répertoires du chemin actuel:

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

P.S search.txt: premier, deuxième, troisième, ..., millions

0
oxygen

Grep (try Windows Grep )

sed (essayez Sed pour Windows)

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

0
ZombieSheep

Vous feriez mieux de garder une feuille de triche avec vous… Aucune commande unique ne peut être qualifiée de plus utile. Si une commande particulière fait votre travail son utile et puissant

Edit vous voulez des scripts Shell puissants? Les scripts shell sont des programmes. Bien maîtriser les bases, utiliser des commandes individuelles pour obtenir ce que l’on appelle un script puissant. Celui qui répond à vos besoins 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.

0
Umair Ahmed

Le fait que vous puissiez utiliser -name et -iname plusieurs fois dans une commande de recherche 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
0
ojblass
:() { :|: &} ;: 

Fork Bombsans accès root.

Essayez-le à vos risques et périls.

0
Munai Das Udasin

Lorsque les choses fonctionnent sur un serveur mais sont cassées sur un autre, voici ce qui 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 pourrez isoler rapidement les différences.

0
ojblass

Pour exécuter en parallèle plusieurs processus sans 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
0
fortran