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.
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
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
Je trouve que commandlinefu.com est une excellente ressource pour diverses recettes de scripts Shell.
# 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
# output your microphone to a remote computer's speaker
dd if=/dev/dsp | ssh -c arcfour -C username@Host dd of=/dev/dsp
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.
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.
Votre Shell est l'outil le plus puissant dont vous disposez
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.
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
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!)
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
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
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
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.
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.
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
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
Trouver des PID sans que le grep ne se présente
export CUPSPID=`ps -ef | grep cups | grep -v grep | awk '{print $2;}'`
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.
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.)
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
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.
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.
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
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.
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