Archives pour la catégorie Shell

Find

Updated: 14 janvier 2014

find bin

Lister dans le répertoire toto/ tous les fichiers crées il y a -40 minutes

find toto/ -type f -mmin -40 -exec ls -rtla {} \;

Une fois qu’on aura vérifié que ça donne le bon résultat, on pourra effacer les fichiers en question remplacer le

-exec ls {}

par

-exec rm {}

Rechercher dans le répertoire courant tout les fichiers bin (qui ont la permission 777)

find . -perm 777  -name mm*

Divers SHELL

Updated: 25 février 2014

  • Vous venez de downloader qq chose (un fichier TOTO par exemple) pour lequel on vous dit que le checksum doit être par exemple :
  • maisditmoiilestsuperdeliretonchecksum

    Pour verifier que le md5 est le bon vous pouvez faire :

    diff <(echo maisditmoiilestsuperdeliretonchecksum) <(md5 -q TOTO)

    qui retourne rien si le md5 est le bon. C’est quand même plus rapide que de passer par des fichiers temporaires.

  • Comparer le contenu de 2 répertoires (dir1 & did 2). On peut utiliser rsync mais en fait le plus simple est d’utiliser diff:
diff -rq dir1 dir2
 
-r  --recursive  Recursively compare any subdirectories found
-q  --brief  Output only whether files differ
  • Faire un test de modulo (tous les 1000)
if [ $(($i% 1000)) -eq 0 ]
then
echo "$i)"
fi
  • Problème d’ordre numérique ?

Imaginons que vous avez un dossier avec des photos qui se nomment :
photo1.jpg, photo2.jpg … photo100.jpg
Si vous faites un

ls -l

Vous allez voir une liste du genre:
photo1.jpg
photo10.jpg
photo100.jpg
photo11.jpg
photo12.jpg
photo13.jpg

L’ordre ne sera pas bon sauf si vous remplacez
photo1.jpg par photo01.jpg, photo2.jpg par photo02.jpg …
Pour avoir le bon ordre il faut faire un petit sort

ls | sort -k 1.6n

Le 1.6 signifiant le 1 champs et 6ème caractère.

awk et LC_NUMERIC

Je me suis bien tiré les cheveux avec le awk de mon Mac Intel (sous Leopard):

des opérations mathématiques simples sur des colonnes d’un fichier me donnaient

des résultats complètement aberrants. 

De même je me suis aperçu que:

echo "1.23456" |awk '{print -$1}''
-1

et que

echo "1,23456" |awk '{print -$1}'
-1,23456

 

En cherchant pas mal sur le web j’ai trouvé que la faute venait de la variable LC_NUMERIC.

locale | grep LC_NUMERIC
LC_NUMERIC="fr_FR.UTF-8"

 

En changeant cette variable par export LC_NUMERIC=C  les résultats étaient complètement différents:

 

echo "1.23456" |awk '{print -$1}'
-1.23456

et 

echo "1,23456" |awk '{print -$1}'
-1

Ce qui a résolu mes problèmes d’opérations mathématiques  (j’ai donc exporter LC_NUMERIC=C dans mon .profile).

 

PS: Cela dit en passant la réponse  -1 donnée,  faudrait m’expliquer …

sed

Remplacer « slash » par « antislash slash » (« / » par « \/ »):

echo $PWD | sed -e "s#/#\\\\\/#g" (en ligne de commande sed -e "s#/#\\/#g" est suffisant)

Pour supprimer les espaces en début de ligne avec sed

sed -e "s/^ *//g"

Pour remplacer abs( par fabs( dans tous les fichiers .cc

for i in *.cc; do sed 's/ abs(/  fabs(/g' $i > $i.tmp ;rm $i; mv $i.tmp $i ; done

Pour s’affranchir de la création des fichiers $i.tmp utiliser tee (merci TjB)

sed 's/ abs(/  fabs(/g'  $i | tee > $i

Récupérer une chaîne de caractères entre () .
Cette chaîne peut avoir aussi des espaces (merci beubeu)

echo "qsdjmlsjkld(00 00)" | sed 's/.*(\(.*\)).*/\1/g'

Changer dans src tout les fichiers commençant par Eli en fichiers commençant par Capi

for i in `ls src/*`;do mv $i `echo $i | sed "s/Eli/Capi/g"` ;done

awk

Updated: 22 mars 2013

Sommer tous les nombres d’une colonne d’un fichier

awk{sum +=$1} END {print sum}’ fichier

fait la somme en valeur absolue

awk '{if ($1 &lt; 0) $1 = -$1} {sum +=$1} END {print sum}' fichier

Sommer les 35000 premiers nombres d’une colonne d’un fichier

awk ' NR &lt; 35000 {sum += $1} END {print sum} ' fichier

Nombre de lignes qui possède la 1ere colonne < 325

awk '$1&lt;325. {print $1}' fichier | wc -l

Sommer les nombres d’une colonne si les valeurs < 325

awk '$1&lt;325 {sum +=$1} END {print sum}' fichier

Imprime les lignes où le mot sampler apparaît

awk '/sampler/{print$0}' fichier

Imprime les lignes où le mot sampler n’apparaît pas

awk '!/sampler/{print$0}' fichier

Compte le nombre de colonne de fichier

awk 'END {print NF}' fichier

Le minimum de la première colonne du fichier test

awk 'min=="" || $1 &lt; min {min=$1} END{ print min}'test

Le maximum de la première colonne du fichier test et à quelle ligne il se situe

awk 'max=="" || $1 &gt; max {max=$1;line=NR} END{ print max,line}'  test

Récupérer une ligne particulière (ici la 17ème ligne)  du fichier TOTO

cat TOTO | awk 'NR == 17 {print;}'

Imprimer toutes les colonnes d’un fichier sauf la dernière

awk '{$NF=""; print $0}' TOTO.txt

et

awk '{$(NF-1)=""; print $0}' ff300_1M.txt

pour supprimer l’avant dernière colonne
Ecrire sur une même ligne (au lieu de passer à la ligne pour chaque valeur) le résultat d’un print d’une colonne

awk '{ printf("%s,",$2) } END {printf("\n")}' toto.txt

Afficher la 1er lettre de toute les lignes du fichier toto

 grep -o ^. toto