Archives pour la catégorie Shell

Récupérer tous les mots composés de 11 caractères chiffres ET lettres

Dans un premier temps on récupère tous les mots qui peuvent être composé soit de chiffres seuls, soit de lettres seules ou les 2 à la fois. Après on utilise 2 grep différents qui nous enlèvent les mots composés de chiffres seuls et de lettres seules.

 cat toto | grep -o '[a-zA-Z0-9][a-zA-Z0-9]\{10,10\}' | grep -v '[a-zA-Z][a-zA-Z]\{10,10\}' | grep -v '[0-9][0-9]\{10,10\}'

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*

Affiche les fichiers (dans le répertoire courant) du plus récent au plus vieux

find . -type f -printf '%T+ \n' | sort

Affiche le dernier fichier (dans le répertoire courant) qui a été accédé

find . -type f | xargs -I file stat --printf '%x %n\n' file  | sort | tail -n 1

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