[commande unix] cut sur tout espace blanc (résolu)
[commande unix] cut sur tout espace blanc (résolu)
salut,
J'ai un ptit soucis avec une commande...
Je fais un:
ls -lrt --time-style +%s
et j'aimerais récupérer la 3ème colonne...
j'ai essayé de faire ça avec cut
genre:
ls -lrt --time-style +%s | cut -d' ' -f4
pour avoir la quatrième colonne...
le problème c'est s'il y a par exemple deux espaces blancs, b'hein j'suis baisée.
Comment faire un cut sur tout espace blanc?
merci.
cassy.
J'ai un ptit soucis avec une commande...
Je fais un:
ls -lrt --time-style +%s
et j'aimerais récupérer la 3ème colonne...
j'ai essayé de faire ça avec cut
genre:
ls -lrt --time-style +%s | cut -d' ' -f4
pour avoir la quatrième colonne...
le problème c'est s'il y a par exemple deux espaces blancs, b'hein j'suis baisée.
Comment faire un cut sur tout espace blanc?
merci.
cassy.
Dernière modification par cassyb le lun. 24 sept. 2007, 10:59, modifié 1 fois.
salut,
je suppose que tu veux plutot la 6eme col?
je suppose que tu veux plutot la 6eme col?
Code : Tout sélectionner
ls -lrt --time-style +%s | awk -F ' ' '{print $6}'
- wain
- Maître du Kyudo
- Messages : 1854
- Inscription : ven. 11 août 2006, 19:15
- Localisation : Nancy (54)
comme tuxce, pour moi a pas mieux que awk pour faire ça.
Autre avantage, on a pas besoin de lui indiquer quel est le séparateur. Il sait reconnaître automatiquement une suite d'espaces ou une tabulation comme une séparation.
donc ceci est suffisant:
ps: en plus awk est beaucoup plus rapide. Dans les traitements répétitifs on sent la différence
Autre avantage, on a pas besoin de lui indiquer quel est le séparateur. Il sait reconnaître automatiquement une suite d'espaces ou une tabulation comme une séparation.
donc ceci est suffisant:
Code : Tout sélectionner
ls -lrt --time-style +%s | awk '{print $6}'
ps: en plus awk est beaucoup plus rapide. Dans les traitements répétitifs on sent la différence
s/pacman/yaourt/g c'est ARCHi clair ! => http://archlinux.fr/
merci à vous deux.
J'aimerais savoir comment parcourir ligne par ligne le resultat du ls -lrt --time-style +%s
genre:
while (ls -lrt --time-style +%s)
do
if(le timestamp de la ligne courante < timestamp_calculé)
echo "ça fait trop longtemps que t'as pas modifié ton répertoire"
done
une idée?
Non pas que la 6ème colonne en fait.je suppose que tu veux plutot la 6eme col?
J'aimerais savoir comment parcourir ligne par ligne le resultat du ls -lrt --time-style +%s
genre:
while (ls -lrt --time-style +%s)
do
if(le timestamp de la ligne courante < timestamp_calculé)
echo "ça fait trop longtemps que t'as pas modifié ton répertoire"
done
une idée?
- wain
- Maître du Kyudo
- Messages : 1854
- Inscription : ven. 11 août 2006, 19:15
- Localisation : Nancy (54)
vite fait:
où 50000000 est l'âge en secondesfor file in *; do
[ `stat -c %Y $file` -lt $((`date +%s` - 50000000)) ] && echo "$file"
done
s/pacman/yaourt/g c'est ARCHi clair ! => http://archlinux.fr/
si le timestamp de référence n'est pas précis au delà d'un jour, tu as aussi ce genre de commande:
avec x le nombre de jours minimum entre la dernière modif et aujourd'hui
Code : Tout sélectionner
find . -maxdepth 1 -mtime -x
@tuxce:
cette commande est puissante, mais c'est l'inverse que je recherche...
les repertoires qui n'ont pas été modifiés depuis x jours...
Mais comment tu fais pour parcourir le resultat dans une boucle après?
@wain:
j'étais tombé sur un script de ce genre sur commentcamarche.net, mais je pensais que c'était trop couteux...
dans chaque itération tu testes la date...ce que je cherchais c'est une commande qui filtrerait la date dès le départ pour juste avoir à parcourir le resultat (forcément avec moins d'iterations), récupérer facilement le user avec awk ou stat et envoyer un mail.
Je vais faire une première version du script avec ta solution wain puis je verrais plus tard si je trouve une façon moins couteuse de le faire.
cette commande est puissante, mais c'est l'inverse que je recherche...
les repertoires qui n'ont pas été modifiés depuis x jours...
Mais comment tu fais pour parcourir le resultat dans une boucle après?
@wain:
j'étais tombé sur un script de ce genre sur commentcamarche.net, mais je pensais que c'était trop couteux...
dans chaque itération tu testes la date...ce que je cherchais c'est une commande qui filtrerait la date dès le départ pour juste avoir à parcourir le resultat (forcément avec moins d'iterations), récupérer facilement le user avec awk ou stat et envoyer un mail.
Je vais faire une première version du script avec ta solution wain puis je verrais plus tard si je trouve une façon moins couteuse de le faire.
pour avoir l'inverse, il suffit de mettre + au lieu de -
ne parcours que le répertoire courant et execute la commande "une_commande" sur chaque nom de fichier non modifié depuis 2 jours.
Code : Tout sélectionner
find . -maxdepth 1 -mtime +1 -exec une_commande \{\} \;
si zsh ne te gêne pas, tu peux le faire en pur shell (pas d'invocation externe)
dans la parenthèse / veux dire uniquement les répertoires
^ veux que les expressions qui suivent seront la négation de leur signification normale
m-2 : modifier ces 2 dernier jours.
mM-2 : donner les 2 dernier mois
mw-2 : les 2 dernières semaines
mh : heures
mm : minutes
ms : secondes,
etc.
Si tu remplaces le premier m par a tu as la modification sur la date d'accès, par c sur les inodes.
Code : Tout sélectionner
for rep in *(/^m-2);do
echo ""ça fait trop longtemps que t'as pas modifié ton répertoire : $rep"
done
^ veux que les expressions qui suivent seront la négation de leur signification normale
m-2 : modifier ces 2 dernier jours.
mM-2 : donner les 2 dernier mois
mw-2 : les 2 dernières semaines
mh : heures
mm : minutes
ms : secondes,
etc.
Si tu remplaces le premier m par a tu as la modification sur la date d'accès, par c sur les inodes.
Code : Tout sélectionner
#!/bin/bash
#verifier si le disk est monte
if ! mount | grep -q "/dev/mapper/ext3backup"
then
echo "le disque externe n'est pas monte"
else
for file in /mnt/ext3backup/*
do
if [ `stat -c "%Y" "$file"` -lt $((`date +%s` - 60*60*24*8)) ]
then
USER=`stat -c "%U" "$file"`
case "$USER" in
cassy)
EMAIL="cassy@arch.fr"
ACTIVE="1";;
user2)
EMAIL="user2@arch.fr"
ACTIVE="0";;
user3)
EMAIL="user3@arch.fr"
ACTIVE="1";;
# usern)
*)
ACTIVE="0";;
esac
if [ "$ACTIVE" = "1" ]
then
(
echo To: $EMAIL
echo From: robot_de_dev@arch.fr
echo Subject: Rappel de sauvegarde sur dev
echo "${USER}, n'oublie pas de lancer la sauvegarde de temps en temps."
) | /usr/sbin/sendmail -t -i -frobot_de_dev@arch.fr $EMAIL
fi
fi
done
fi
Dernière modification par cassyb le ven. 21 sept. 2007, 14:18, modifié 4 fois.
Code : Tout sélectionner
if [ "$USER" = "cassy" ]
#....
@bapt:
seduisant mais je n'ai pas zsh...
@tuxce:
aucun soucis ça marche.
J'ai édité car le script peut interresser quelqu'un (genre s'il recherche sendmail)
y'aurait-il moyen d'utiliser ta commande dans le script?
peut-on faire un:
merci.
seduisant mais je n'ai pas zsh...
@tuxce:
aucun soucis ça marche.
J'ai édité car le script peut interresser quelqu'un (genre s'il recherche sendmail)
Je n'ai pas encore utiliser ta commande car dans l'accolade exec j'ai un peu de traitement...find . -maxdepth 1 -mtime +1 -exec une_commande \{\} \;
y'aurait-il moyen d'utiliser ta commande dans le script?
peut-on faire un:
à la place defor i in (find /mnt/ext3backup -maxdepth 1 -mtime +7)
quelle serait la syntaxe?for file in /mnt/ext3backup/*
merci.
- wain
- Maître du Kyudo
- Messages : 1854
- Inscription : ven. 11 août 2006, 19:15
- Localisation : Nancy (54)
sans utiliser exec, ça donne tout simplement ceci:
@bapt: vraiment très intéressantes ce genre de fonctions dans zsh ![/code]
Code : Tout sélectionner
for file in `find /mnt/ext3backup -maxdepth 1 -mtime +7`; do
....
done
s/pacman/yaourt/g c'est ARCHi clair ! => http://archlinux.fr/
zsh regorge de petites fonctionnalités excellentes de ce type là et comme je ne me lasse pas du prosel, vous aurez régulièrement le droit à des petits trucs zsh maintenant que je traine ici sauf si vous me dites que je suis trop lourd ...wain a écrit : @bapt: vraiment très intéressantes ce genre de fonctions dans zsh !