ls toto | xargs -n 1 cat |
On utilise la sortie standard precedante come argument du cat |
find | grep "~" | xargs -n 1 rm |
On va effacer tous les fichier touver par find contnant un ~ |
ssh lionel@antec cat /opt/toto.xml |diff /opt/toto.xml - |
L'usage du moins permet d'utiliser le le fux standard en entré du diff |
vmstat | grep -v procs|grep -v r| tr -s ' '|cut -d " " -f 14 |
grep -v (select inversse) tr -s' ' suprime les espaces en doublon tr -d ' ' tous les espace |
ps -edf | grep wget | tr -s ' '| cut -d" " -f 2 | xargs -n 1 kill -9 |
kill -9 des process selectionné dans le grep |
cat encode.txt | tr -s ' ' | tr -d '\011' | tr ' ' '=' > tmp |
on garde 1 seul espace on vire les tab puis on rempalce les espace par des egales |
gunzip -dc /opt/logs/pushCostRevenue-uk-2010-12-07.tsv.gz |awk -F"@" 'length($6)>40 {print length($6) " " $6}'
|
affiche le champ 6 si celui si a plus de 40 char (-F indique le changement du separateur par default) |
date +%m --date='-10 day' | awk '{sub (/^0/,"")};1' |
affiche le mois d'il ya 10 jours et suprime le zero du debut |
grep -RH InetAddress .|grep -v target|cut -d":" -f 1|sort|uniq |
recherche dans le code InetAddress et n'afiche que 1 fois chaque class le contenant |
sed -i 's/lio gad/lionel gadille/g' *.html |
Remplace dans tous les fichier *.html lio gad par lionel gadille |
grep -RH \!password * | cut -d : -f 1 | xargs sed -i "s/\!password/gadille/g" |
Cherche !passowrd dans tous les soudir, recupére l'info du fichier le conteant et le passe a sed pour effectuer un remplacement |
cat listeSalles|cut -d":" -f1| awk '{sub("","image");print}' | awk '{sub("$",".pdf");print}' |
rajoute en debut de listeSalle image et pdf en fin |
find . -name "*.html" | xargs perl -pi -e 's/href="\/css/href="\/common\/css/' |
remplace dans tous les fichier html href="/css/ par href="/common/css |
cat frompost | tr "&" "\n" > frompost2 |
remplace dans tous le fichier & par \n (retour ligne) |
sshResult=`ssh root@ensinet 'grep "^Apr 23" /nsr/logs/messages|grep "Failed:\|Succeeded: \| Succeeded with warning(s):"'`
echo "$sshResult"
|
effectue un grep sur un serveur avec des ou et stock le tosu dans uen vare resultat |
$0 | Contient le nom du script tel qu'il a été invoqué |
$* | L'ensembles des paramètres sous la forme d'un seul argument |
$@ | L'ensemble des arguments, un argument par paramètre |
$# | Le nombre de paramètres passés au script |
$? | Le code retour de la dernière commande |
$$ | Le PID du shell qui exécute le script |
$! | Le PID du dernier processus lancé en arrière-plan |
Plusieurs point de base sont intéressant#!/bin/bash set -e # exit a la première erreur (code retour diff de zero)
function help(){ echo "Passer en argument le nom du serveur Ade à tester" echo "exemple: ./dist-loadavg.sh hostname" exit 3 } if [ -z "$1" ] #test que $1 est non vide then help fi if [ $# -ne 1 ];then #test si il y 'a bien que 1 arg help fi ssh sinfo@$1 "perl ~/monitoring/loadavg_multi.pl" exit 0
exit N Nagios et d'autre script se base sur les code retour pour déterminer l'état de la sonde il faut donc renseigner l'etat de sortie du script#!/bin/bash # nagios plugin vérifiant que le service web ADE est ok set -e # exist a la premiére erreur (code retour diff de zero) if [ -n "$1" ] then host=$1 protocol="http://" url=$protocol$host"/ade/custom/modules/plannings/direct_planning.jsp?projectId=106&login=xxxx&password=xxxx&resources=819&days=0,1,2,3,4&displayConfId=5" #echo "host:${host} url:${url}" #on save le resulta de la requette vers ade.html wget -O /tmp/ade.html "${url}" >/dev/null 2>&1 test="/ade/standard/gui/tree.jsp?forceLoad=false&isDirect=true" if grep -q ${test} /tmp/ade.html then echo "Ade ok : chaine de test localisé" exit 0 else echo "Ade ko:Erreur chaine de test non localisé" exit 2 fi else echo "Passer en argument le nom du serveur Ade à tester" echo "exemple: ./Ensimag-ade-web.sh xxx.fr" exit 3 fi exit 0
affiche :for i in `seq -w 2 20`;do echo toto $i done
cut -d. -f1 -d=delimiter -f=fieldfor i in `seq -w 2 20`;do echo toto $i; done for i in *.del; do FN=$(echo $i | cut -d. -f 1 ); echo "$i $FN.ixf"; done | xargs -n 2 mv
cut deux parenthese obligatoirefor((i=1;i<=20;i=i+1)); do echo toto $i; done for((i=1;i<=20;i=i+1)); do cp 0ro20/* 0ro2$i; done for((i=1;i<=20;i=i+1)); do mkdir 0ro2$i;cp 0ro20/* 0ro2$i ; done
filename Block special file | |
filename Special character file | |
directoryname Check for directory existence | |
filename Check for file existence | |
filename Check for regular file existence not a directory | |
filename Check if file exists and is owned by effective group ID. | |
filename true if file exists and is set-group-id. | |
filename Sticky bit | |
filename Symbolic link | |
filename True if file exists and is owned by the effective user id. | |
filename Check if file is a readable | |
filename Check if file is socket | |
filename Check if file is nonzero size | |
filename Check if file set-ser-id bit is set | |
filename Check if file is writable | |
filename Check if file is executable |
if [ $# -eq 2 ];then echo "ok 2 arg arg1:$1 arg2:$2" else echo "miss arg you got $# arg and we wait 2 arg" fiexemple: test dir
if [[ ! ( -d /tmp/mountpoint/) ]];then echo "point de montage manquant" fiexemple: substring test
-q = silenceif grep -q ${test} /tmp/ade.html then echo "Ade ok : chaine de test localisé" exit 0 else echo "Ade ko:Erreur chaine de test non localisé" exit 2 fiexemple: test fichier
Ici je cherche a lancer run.sh qui ne ce trouve pas au meme endroit suivant les serveursresult="getTriodePort not found" if [ -f ./getTriodePort/run.sh ];then result=`./getTriodePort/run.sh` fi if [ -f /home/gadillel/script/getTriodePort/run.sh ];then result=`/home/gadillel/script/getTriodePort/run.sh` fiLecture fichier
in | code | out |
---|---|---|
10 11 12 20 21 22 |
while read ligne;do echo $ligne done< fichier.txt |
10 11 12 20 21 22 |
10,11,12 20,21,22 |
for ligne in `cat test.log`;do if [ "$ligne" = "" ]; then break; fi set -- $ligne a=$1 echo "element $a" done |
element 10,11,12 element 20,21,22 |
10,11,12 20,21,22 |
for ligne in `awk -F ',' '{print $1" "$2" "$3}' test.log`;do if [ "$ligne" = "" ]; then break; fi set -- $ligne a=$1 echo "element $a" done |
element 10 element 11 element 12 element 20 element 21 element 22 |
10,11,12 20,21,22 |
while IFS=, a b c ;do echo "a:$a" echo "b:$b" echo "c:$c" done < fichier.txt |
a:10 b:11 c:12 a:20 b:21 c:22 |
contient
10 11 12 20 21 22 |
IFS=$(echo -en "\n\b") for line in `cat /opt/logs/consolidated/uk/2010/201010/SearchLog_20101026_1.test |head`;do echo "toto: $line";done # sans le premier IFS on a une ligne par nombre (espace est un séparateur) |
10 11 12 20 21 22 |
#!/bin/bash
array=(one two three four [5]=five)
echo "Array size: ${#array[*]}"
echo "Array items:"
for item in ${array[*]}
do
printf " %s\n" $item
done
echo "Array indexes:"
for index in ${!array[*]}
do
printf " %d\n" $index
done
echo "Array items and indexes:"
for index in ${!array[*]}
do
printf "%4d: %s\n" $index ${array[$index]}
done
stringZ=abcABC123ABCabc
echo ${stringZ/abc/xyz} # xyzABC123ABCabc
# Replaces first match of 'abc' with 'xyz'.
echo ${stringZ//abc/xyz} # xyzABC123ABCxyz
# Replaces all matches of 'abc' with # 'xyz'.
Test:
a=${ligne/$test*/} #on coupe des que l'on trouve ce que l'on veux et on met le debut dans a
if [ "$ligne" != "$a" ];then #du coups si on trouve $ligne != $a
echo "$test et dans $ligne"
fi
for((i=1;i<=12;i=i+1));do if [ 10 -gt $i ];then b="0$i";else b=$i;fi;ln -fs 2007-08 2010-$b;done #version longue for((i=1;i<=12;i=i+1)) do if [ 10 -gt $i ] then b="0$i" else b=$i fi ln -fs 2007-08 2010-$b doneString comparaison
if [ ${Login} != "Login" ]; then echo "change your login" fiRemplacement dans une liste de fichier d'une string
for i in $(find . -regex ".*html");do cat $i | awk '{ sub("</body>","<object type=\"text/html\" data=\"./common/piedpage.html\" width=\"160px\" height=\"600px\"></body>");print}' > $i.toto ;mv $i.toto $i ;done;
find . -regex ".*html"
Recherche les fichiers et affiche que ceux correspondant a la regex
. =n'importe qu'elle character
* repeter0 ou n fois)
Remplacement dans une liste de fichier (contenant un truc puis filtré) d'une string
Remplacer dans des fichier une string par une autre
for i in $(grep -RF "FR - Gre" * | grep xml| cut -d: -f1 | grep test); do cat $i | awk '{ sub("FR - Grenoble","FR-Grenoble");print}' > $i.toto ;mv $i.toto $i ;done;
Analyse code formaté
for i in $(grep -RF "FR - Gre" * | grep .xml | cut -d: -f1 | grep test);
do cat $i | awk '{ sub("FR - Grenoble","FR-Grenoble")print}' > $i.toto
mv $i.toto $i
done;Analyse boucle
for in i in groupe1 ;
do groupe2
mv
done
Pour tous les fichier sortie par groupe 1
J'execute groupe 2 puis un mv
Analyse groupe1
grep -RF "FR - Gre" *
Cherche tous les fichier contenant FR ... recursivement
R = recursif fouille tous les sous rep
F = patern fix (ou cherche sa sans l'interpreter bétement)
"Fr - Gre" = ce que je cherche
* = tous les fichier et sous repertoir
Sa me renvoit un truc de la forme
grep -RF "FR - Gre" *
vacance/vacance.html:FR - Gre
vacance/vacance.xml:FR - Gre
|
Me renvoie sa dans la commande suivante
grep .xml
Me suprine tous les fichiers qui ne contiennent pas dans leur nom .xml
cut -d: -f1
Garde la partie avant les :
-d: definie : comme le delimiteur (séparateur)
-f1 ne garde que le champs 1 en sortie
Analyse groupe2
cat $i
Je liste le contenue des fichiers issue du groupe 1 sur le qu'elle on boucle
awk '{ sub("FR - Grenoble","FR-Grenoble");print}'
Je recupe toute les ligne et les affiche en sortie si elle contiennt FR - Grenoble je remplace par FR-Grenoble
$gt;$i.toto
fichier temps apres je fais le mv poru remettre sur l'original
Exemple cut sort uniq
toto.txt:
Login,Location,Passwordcat exportAD.csv.1243415908289 | cut -d, -f 2 | sort | uniq
titi,UK - London,Password
tata,UK - London,Password
toto,ES - Madrid,Password,pasglop
ES - Madridle sort est obligatoir car le uniq ne marche que sur des elements qui ce suive
Location
UK - London
Exemple update de database:
Fichier d'entré du script
"Work Location","Employee User Id","New UserId","Name","Yahoo EMAIL ","Kelkoo EMAIL",
"UK - London","toto",,"tata","tataa@yahoo.com","tataa@yahoo.com@hotmail.fr",
"FR - Paris","ADRIEN",,"Adrien le chauve","adrien@yahoo.com","adrien@hotmail.fr",
Le script bash
list=$1
rediriger la sorti dans script.mysql
while IFS=, read pos prenom nom groupir old new ;do
printf "update profiles set mail = $new where mail = $old\n";
done < $list
mysql -umonuser -pmonpassword -hmadatabase matable < script.mysql
truc
date
date -d "1970-01-01 UTC + 1263486436 seconds"
jeu. janv. 14 17:27:16 CET 2010
date -d "2010-01-14 + 17 hours + 27 minutes + 16seconds" +"%s"
1263486436
date +%Y-%m-%d --date='-10 month'
redirection
cat test.sh
echo "test"
echo This message goes to stderr >&2
./test.sh > test.txt 2>&1
color
List of Color code
Couleur | Texte | Arrière-plan |
Noir | 30 | 40 |
Rouge | 31 | 41 |
Vert | 32 | 42 |
Jaune | 33 | 43 |
Bleu | 34 | 44 |
Magenta | 35 | 45 |
Cyan | 36 | 46 |
Blanc | 37 | 47 |
(awk -F '=' '{print $2}' in.log > out.log)in.log: toto=titi
(awk -F ' ' '{print $2,$4}' in.log > out.log)in.log: toto titi tata br
(awk -F ' ' '{print "http://dev.monsieurprix.com/search?s="$1}' in.log > out.log)in.log: toto tata
a=$(echo ${release} | awk -F '.' '{print $1" "$2" "$3}') echo "a: $a" set -- $a Major=$1 Minor=$2 PatchLevel=$3 echo "Major: $1 Minor: $2 Patch: $3"$release 1.11.0
cat $list.tmp | awk '{gsub("\\\"","");print}'
cat $list.tmp | awk '{sub("\\\"","");print}'
on remplace dans le ficheir $uid la ligne qui commence par cn:< par "cn: "val (val=variable val)
cat $outdir/$uid.ldif | awk -v val="$val" ' /cn: { $0="cn: "val} { print } '
for var in uk de dk nl no it es be se nb do cat /home/lionel/instance1/conf/Catalina/localhost/fr.xml | awk '{ sub("/fr/","/'$var'/");print}' > /home/lionel/instance1/conf/Catalina/localhost/$var.xml donefr.xml (in):http://gadille.free.fr/fr/
awk -F ":" '{ $2 = "" ; print $0 }' /etc/passwd imprime chaque ligne du fichier /etc/passwd après avoir effacé le deuxième champ awk 'END {print NR}' fichier imprime le nombre total de lignes du fichiers awk '{print $NF}' fichier imprime le dernier champs de chaque ligne who | awk '{print $1,$5}' imprime le login et le temps de connexion. awk 'length($0)>75 {print}' fichier imprime les lignes de plus de 75 caractères. (print équivaur à print $0) # precede chaque ligne par son numéro pour ce fichier (alignement à gauche). awk '{print FNR "\t" $0}' files* # precede chaque ligne par son numéro Pour l'ensemble des fichiers, avec une tabulation. awk '{print NR "\t" $0}' files* # énumère chaque ligne d'un fichier (le nombre est à gauche, aligné à droite) awk '{printf("%5d : %s\n", NR,$0)}' # énumère chaque ligne du fichier, mais ecrit seulement les nombres si la ligne n'est pas vide awk 'NF{$0=++a " :" $0};1' awk '{print (NF? ++a " :" :"") $0}' # compte les lignes (comme "wc -l") awk 'END{print NR}' # écrit la somme des champs de chaque ligne awk '{s=0; for (i=1; i<=NF; i++) s=s+$i; print s}' # ajoute tous les champs de toutes les lignes et affiche la somme awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print s}' # affiche chaque ligne après avoir remplacé chaque champ par sa valeur absolue awk '{for (i=1; i<=NF; i++) if ($i < 0) $i = -$i; print }' awk '{for (i=1; i<=NF; i++) $i = ($i < 0) ? -$i : $i; print }' # affiche le nombre total de champs ("mots") de toutes les lignes awk '{ total = total + NF }; END {print total}' fichier # affiche le nombre total de lignes qui contiennent "Beth" awk '/Beth/{n++}; END {print n+0}' fichier # affiche le premier champ le plus grand et la ligne qui le contient awk '$1 > max {max=$1; maxline=$0}; END{ print max, maxline}' # affiche le nombre de champs de chaque ligne, suivi par la ligne awk '{ print NF ":" $0 } ' # affiche le dernier champ de chaque ligne awk '{ print $NF }' # affiche le dernier champ de la dernière ligne awk '{ field = $NF }; END{ print field }' # affiche toutes les lignes de plus de quatre champs awk 'NF > 4' # affiche toutes les lignes dans lesquelles la valeur du dernier champ est supèrieure à 4 awk '$NF > 4' # crée une chaine d'une certaine longueur (c'est-à-dire avec 513 espaces) awk 'BEGIN{while (a++<513) s=s " "; print s}' # insére une chaine d'une certaine longueur à une certaine position de caractère # Exemple: insére 49 espaces après la colonne 6 de chaque ligne en entrèe. gawk --re-interval 'BEGIN{while(a++<49)s=s " "};{sub(/^.{6}/,"&" s)};1' # crée un tableau nommé month, indexé par des numéros afin que month[1] # soit 'Jan', month[2] 'Feb', month[3] 'Mar' et ainsi de suite. split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month, " ") # crée un tableau appelé "mdigit", indexé par des chaines, afin que # mdigit["Jan"] soit 1, mdigit["Feb"] 2, etc. Necessite un tableau "month" for (i=1; i<=12; i++) mdigit[month[i]] = i # Dans un environnement UNIX, convertit des lignes DOS (CR/LF) en format Unix awk '{sub(/\r$/,"")};1' # suppose que chaque ligne finit par Ctrl-M # Dans un environnement UNIX convertit des lignes Unix (LF) en format DOS awk '{sub(/$/,"\r")};1' # Dans un environnement DOS convertit des lignes Unix (LF) en format DOS awk 1 # Dans un environnement DOS convertit des lignes DOS (CR/LF) en format Unix # Ne peut être fait avec les versions DOS de awk, autres que gawk: gawk -v BINMODE="w" '1' infile >outfile # supprimer les espaces principaux (espaces, tabulations) au début de chaque ligne awk '{sub(/^[ \t]+/, "")};1' # supprime les espaces finaux (espaces, tabulations) de la fin de chaque ligne awk '{sub(/[ \t]+$/, "")};1' # supprime les espaces au début et à la fin de chaque lignes awk '{gsub(/^[ \t]+|[ \t]+$/,"")};1' awk '{$1=$1};1' # supprime également des espaces supplémentaires entre les champs # insére cinq espaces vides au début de chaque ligne (fait une page de décalage) awk '{sub(/^/, " ")};1' # aligne le texte à droite avec une largeur de 79-colonnes awk '{printf "%79s\n", $0}' fichier* # centre le texte avec une largeur de 79-caractères awk '{l=length();s=int((79-l)/2); printf "%"(s+l)"s\n",$0}' fichier* # remplace (trouve et remplace) "foo" par "bar" dans chaque ligne awk '{sub(/foo/,"bar")}; 1' # remplace seulement la première occurence gawk '{$0=gensub(/foo/,"bar",4)}; 1' # remplace seulement la quatrième occurence awk '{gsub(/foo/,"bar")}; 1' # remplace toutes les occurences de la ligne # remplace "foo" par "bar" seulement pour les lignes qui contiennent "baz" awk '/baz/{gsub(/foo/, "bar")}; 1' # remplace "foo" par "bar" sauf pour les lignes qui contiennent "baz" awk '!/baz/{gsub(/foo/, "bar")}; 1' # modifie "scarlet" ou "ruby" ou "puce" en "red" awk '{gsub(/scarlet|ruby|puce/, "red")}; 1' # inverser l'ordre des lignes (comme avec "tac") awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' fichier* # si une ligne se finit par un backslash, ajoutez la ligne suivante à celui-ci (cela échoue si il y a plusieurs lignes #finissant par un backslash...) awk '/\\$/ {sub(/\\$/,""); getline t; print $0 t; next}; 1' fichier* # affiche et trie les noms de login de tous les utilisateurs awk -F ":" '{print $1 | "sort" }' /etc/passwd # affiche les deux premiers champs, en ordre inverse de chaque ligne awk '{print $2, $1}' file # échange les deux premiers champs de chaque ligne awk '{temp = $1; $1 = $2; $2 = temp}' fichier # affiche chaque ligne, en supprimant le second champ de cette ligne awk '{ $2 = ""; print }' # affiche dans l'ordre inverse les champs de chaque ligne awk '{for (i=NF; i>0; i--) printf("%s ",$i);print ""}' file # concatene toutes les 5 lignes en entrée, en employant un séparateur virgule # entre les champs awk 'ORS=NR%5?",":"\n"' file # affiche les 10 premières lignes du fichier (émule le comportement de la commande "head") awk 'NR < 11' # affiche la première ligne du fichier (émule "head -1") awk 'NR>1{exit};1' # affiche les deux dernières lignes d'un fichier (émule "tail -2") awk '{y=x "\n" $0; x=$0};END{print y}' # affiche la dernière ligne d'un fichier (émule "tail -1") awk 'END{print}' # affiche seulement les lignes qui correspondent à une expression régulière (émule "grep") awk '/regex/' # affiche seulement les lignes qui ne correspondent pas à une expression régulière (émule "grep -v") awk '!/regex/' # affiche toutes les lignes où le champ #5 est égal à "abc123" awk '$5 == "abc123"' # affiche seulement les lignes où le champ #5 n'est pas égal à "abc123" # cela affichera aussi les lignes qui ont moins de 5 champs. awk '$5 != "abc123"' awk '!($5 == "abc123")' # correspondance avec un champ à l'aide d'une expression régulière awk '$7 ~ /^[a-f]/' # affiche la ligne si le champ #7 correspond à l'expression régulière awk '$7 !~ /^[a-f]/' # affiche la ligne si le champ #7 ne correspond pas à l'expression régulière # affiche la ligne immédiatement avant une expression, mais pas la ligne contenant l'expression awk '/regex/{print x};{x=$0}' awk '/regex/{print (NR==1 ? "match on line 1" : x)};{x=$0}' # affiche la ligne immédiatement après l'expression, mais pas la ligne contenant l'expression awk '/regex/{getline;print}' # fait une recherche avec grep pour AAA et BBB et CCC (dans n'importe quel ordre sur la même ligne) awk '/AAA/ && /BBB/ && /CCC/' # fait une recherche avecc grep pour AAA et BBB et CCC (dans cet ordre) awk '/AAA.*BBB.*CCC/' # affiche seulement des lignes de 65 caractères ou plus awk 'length > 64' # affiche seulement des lignes de moins de 65 caractères awk 'length < 64' # affiche la partie du fichier depuis l'expression régulière jusqu'à la fin du fichier awk '/regex/,0' awk '/regex/,EOF' # affiche la partie du fichier basée sur les numéros de ligne (lignes 8-12, inclus) awk 'NR==8,NR==12' # affiche la ligne numéro 52 awk 'NR==52' awk 'NR==52 {print;exit}' # plus efficace avec de gros fichiers # affiche une partie d'un fichier entre deux expressions régulières (inclus) awk '/Iowa/,/Montana/' # sensible à la casse # supprimer toutes les lignes vides d'un fichier (même chose que "grep '.' ") awk NF awk '/./' # supprime des doublons et des lignes consécutives (émule "uniq") awk 'a !~ $0; {a=$0}' # supprime les doublons et les lignes non-consécutives awk '!a[$0]++' # script plus concis awk '!($0 in a){a[$0];print}' # script plus efficace