Un peu plus général, ~ $ echo 'foo(tata,titi,toto,tutu)--pasfoo(1,2,3)--foo(pif,paf)' | \
sed -e 's/\<foo(\([^)]*\),\([^,)]*\))/foo(\2,\1)/g'
foo(tutu,tata,titi,toto)--pasfoo(1,2,3)--foo(paf,pif)
Une fois la connexion FTP établie, les données passent par un autre port,
donc ajoute la règle générale iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(ou sinon, ouvre aussi le port 20 vers le réseau local...).
Le « + » a (à peu près) le même effet qu'un pipe vers xargs ; pour voir la différence avec le «\;», compare
find ~/ -exec echo Echo {} \; | grep -c ^Echo
find ~/ -exec echo Echo {} + | grep -c ^Echo
find ~/ | xargs echo Echo | grep -c ^Echo
Les deux dernières regrouperont les arguments trouvés par find.
On peut même mettre plusieurs blocs -exec ... + à la suite, mais si tu veux une séquence logique, il vaut mieux écrire un script capable de traiter plusieurs arguments à la fois :
... -exec ton_script.sh {} +
Sinon, il faut répéter l'argument
... -exec sh -c "echo A "{}"; echo B "{} \;
(le + n'est utilisable qu'avec un seul {} à la fin).
Si, la redirection peut être écrite n'importe où (en dehors d'une chaîne de caractères). Si tu veux la limiter à la commande en -exec, il faut utiliser le sh -c "sous-script shell avec ses redirections".
On peut regrouper les substitutions dans le même script Sed (GNU Sed) --- ou utiliser plusieurs options -e commande :
find ... -exec sed -i -e 's/a_intouch/w_intouch/g ; s/b_intouch/x_intouch/g' {} + ...
Le + au lieu de \; permet de ne pas lancer un sed par fichier.
Le code de NBaH peut encore être allégé en intégrant le if au script Sed ;
par ailleurs, il vaut mieux remplacer le sous-shell par un pipe :sed -ne '/UFW /{
/SRC=192\.168/d
s/.*SRC=\([^ ]*\) .*/\1/p' /var/log/syslog |\
while read ip ; do
echo "$ip"
whois "$ip" | grep -m1 -i 'country:'
done (en simplifiant ton grep | head -1).
De même, ton cat | grep | awk | grep -v peut être raccourci : </var/log/syslog awk '/UFW BLOCK INPUT/ && !/SRC=192\.168/{print $14}'
(sans -F, vérifie le $14).
On peut aussi intégrer sort | uniq -c au script Awk...
Il y a trop de réponses parce que, sans accolades, seul le premier N dépend de la condition /prints(m_IPaddr)/ :
sinon, le second N ajoute toujours la ligne suivante dans le tampon,
et si sed y trouve une IP précédée d'une tabulation ...
Oui, mais non : il faut tout mettre entre accolades...
sed -nre '/prints\(m_IPaddr\)/{
n;n # saute les deux lignes inutiles
s/[ \t]+//g # supprime les espaces et tabulations
/^[0-9]{1,3}(\.[0-9]{1,3}){3}$/p # écrit quand le reste ressemble à une IP
}'
On peut éviter le pipe vers xargs, et les problèmes de noms de
fichiers vicieux (qui ne doivent pas se poser ici) --- voir les options -print0 de find et -0 de xargs.
find /var/qmail/mails/root -type f -exec rm -f {} +
Sans l'option -type f, il faut peut-être reconstituer les trois
sous-répertoires cur, new et tmp et vérifier leurs permissions.
La remarque sur l'ancienneté est judicieuse, il serait bon de lire
quelques messages récents avant de tout nettoyer ;).
Modifier les exifs ne change pas l'image proprement dite, mais
seulement ses méta-données : si on fait la chasse aux doublons,
il vaut mieux éviter de perdre des informations, mais on peut aussi
vouloir les regrouper dans un même fichier.
Tant qu'on se contente d'ajouter des infos, on peut
considérer que l'original est intact.
Garder dans le nom de fichier les quatre chiffres issus de l'APN
peut aussi être utile...
Malheureusement, la moindre modification d'un champ Exif va fausser le test MD5,
qui ne permet de détecter que les doublons stricts.
On peut extraire l'image JPEG seule, par exemple avec jhead, option -purejpg,
voire utiliser l'imagette incorporée, qui pourrait tolérer de légères modifications, et allégera un peu le travail de md5sums.
M'enfin, quand il ne faut pas régénerer l'imagette...
Bonjour,
les fainéants préfèreront taper for letter in {a..z} ; do ....
Les > "$LIST" ne sont pas très utiles, seul celui des z survivra...
Le cat "$LIST" | afio ... est un « UUOC », on peut le remplacer par un < "$LIST" afio ... : j'utiliserais plutôt un seul pipe, avec si besoin l'étape supplémentaire find ... | tee -a "$LIST" | afio ... pour garder une copie de la liste (ou des "${LIST}_$letter").
Par ailleurs certaines lettres pourraient être absentes, on peut le tester : [ "$(printf '%s' /home/${letter}*)" != "/home/${letter}*" ] && find ....
Quand on précise -resize 640x640 , la conversion se fera dans le carré indiqué, mais en respectant les proportions (et donnera donc 640x480 ou 480x640 selon l'orientation --- il y a des variantes plus compliquées).
L'appel à Sed est inutile, le shell (Bash, Zsh, ...) sait modifier ses variables, qu'il vaut mieux protéger en cas d'espaces : convert "$i" -resize -40x640 "Image${i#Photo}"
On peut aussi n'appeler qu'une seule instance de mogrify pour éviter la boucle, en rusant sur l'extension : mogrify -format jpeg -resize 640x640 '*.jpg'
J'aime beaucoup avec awk. Un jour peut-être, je lirais la doc :-)
Elle est tout de même plus longue que celle de Sed :)
Ma question à deux balles: tu utilises awk "en vrai" ou c'est juste pour le plaisir de l'exemple ?
Oui, je l'utilise --- Awk est parfois très concis, par exemple iptables -nvL | awk '$1'
ou un uniq sans tri : awk '!n[$0]++'. Il permet aussi d'éviter de piper plusieurs grep.
Kerro :
# echo '0 2 54 fg1t 564.9' | sed -n '/0/ {s/0/zero/}; /1/ {s/1/un/}; /2/ {s/2/deux/}; /3/ {s/3/trois/}; /4/ {s/4/quatre/}; /5/ {s/5/cinq/}; /6/ {s/6/six/}; /7/ {s/7/sept/}; /8/ {s/8/huit/}; /9/ {s/9/neuf/}; p'
zero deux cinqquatre fgunt 5six4.neuf
S'amuser en root, c'est Mal(C)...
$ echo '0 2 54 fg1t 564.9' | sed -e '
/0/ s//zero/g
/1/ s//un/g
/2/ s//deux/g
/3/ s//trois/g
/4/ s//quatre/g
/5/ s//cinq/g
/6/ s//six/g
/7/ s//sept/g
/8/ s//huit/g
/9/ s//neuf/g
'
zero deux cinqquatre fgunt cinqsixquatre.neuf
et avec Awk :
awk '
BEGIN{
split("un deux trois quatre cinq six sept huit neuf",L);
L[0]="zéro";
}
/[0-9]/{
for(n=0;n<10;n++){gsub(n,L[n])}
print;
}'
Ca me fait penser à une question entendue dans je ne sais quel jeu télévisé: quel est le chiffre inscrit sur le maillot de tel
joueur de foot ? Le candidat répond à toute vitesse 1 2 3 4 5 6 7 8 9. Nan nan la réponse était 11 :-)
Ben, dans l'équipe B, ils ont des numéros hexadécimaux ?
Je crains que la seconde solution ne marche pas, quand on insère plusieurs lignes avec la commande i, toutes les lignes sauf la dernière doivent être terminées par un \ ; il faudrait aussi entourer la construction $(...) par des doubles quotes pour empêcher le shell de la découper aux espaces...
Par ailleurs, la commande 1i... va se retrouver comme argument de l'option -i, il faut insérer -e entre l'option -i sans argument et la commande Sed.
La première solution est évidemment plus simple (et plus lisible :), mais on peut, avec l'aide de Bash, emboîter deux (GNU) Seds :
# Le dernier devient le premier...
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Changer l'ordre de mes paramètres de fonction. Évalué à 2.
~ $ echo 'foo(tata,titi,toto,tutu)--pasfoo(1,2,3)--foo(pif,paf)' | \
sed -e 's/\<foo(\([^)]*\),\([^,)]*\))/foo(\2,\1)/g'
foo(tutu,tata,titi,toto)--pasfoo(1,2,3)--foo(paf,pif)
# Ouvre aussi les autres ports pour le suivi de connexion...
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Serveur FTP VsFTP et Configuration de iptables. Évalué à 4.
donc ajoute la règle générale
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(ou sinon, ouvre aussi le port 20 vers le réseau local...).
[^] # Re: ImageMagick
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Automatisation de réduction d'image. Évalué à 3.
# Imgseek
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Identification d'images identiques. Évalué à 3.
[^] # Re: 2 ou 3 choses
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Fichier de trace. Évalué à 1.
http://sed.sf.net/
[^] # Re: 2 ou 3 choses
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Fichier de trace. Évalué à 1.
find ~/ -exec echo Echo {} \; | grep -c ^Echo
find ~/ -exec echo Echo {} + | grep -c ^Echo
find ~/ | xargs echo Echo | grep -c ^Echo
Les deux dernières regrouperont les arguments trouvés par find.
On peut même mettre plusieurs blocs -exec ... + à la suite, mais si tu veux une séquence logique, il vaut mieux écrire un script capable de traiter plusieurs arguments à la fois :
... -exec ton_script.sh {} +
Sinon, il faut répéter l'argument
... -exec sh -c "echo A "{}"; echo B "{} \;
(le + n'est utilisable qu'avec un seul {} à la fin).
Si, la redirection peut être écrite n'importe où (en dehors d'une chaîne de caractères). Si tu veux la limiter à la commande en -exec, il faut utiliser le sh -c "sous-script shell avec ses redirections".
[^] # Re: 2 choses
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Fichier de trace. Évalué à 1.
[^] # Re: 2 choses
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Fichier de trace. Évalué à 2.
find ... -exec sed -i -e 's/a_intouch/w_intouch/g ; s/b_intouch/x_intouch/g' {} + ...
Le + au lieu de \; permet de ne pas lancer un sed par fichier.
[^] # Re: Aargh, fermer l'accolade... :/
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message pb execution d'un script lire ligne a ligne plus whois des resultats. Évalué à 2.
sed -ne '/UFW /{
/SRC=192\.168/d
s/.*SRC=\([^ ]*\) .*/\1/p
}' /var/log/syslog |\
...
[^] # Re: lecture syslog + whois
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message pb execution d'un script lire ligne a ligne plus whois des resultats. Évalué à 3.
par ailleurs, il vaut mieux remplacer le sous-shell par un pipe :
sed -ne '/UFW /{
/SRC=192\.168/d
s/.*SRC=\([^ ]*\) .*/\1/p' /var/log/syslog |\
while read ip ; do
echo "$ip"
whois "$ip" | grep -m1 -i 'country:'
done
(en simplifiant ton grep | head -1).
De même, ton cat | grep | awk | grep -v peut être raccourci :
</var/log/syslog awk '/UFW BLOCK INPUT/ && !/SRC=192\.168/{print $14}'
(sans -F, vérifie le $14).
On peut aussi intégrer sort | uniq -c au script Awk...
[^] # Re: Réponse sed
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Question sed. Évalué à 1.
N dépend de la condition /prints(m_IPaddr)/ :
sinon, le second N ajoute toujours la ligne suivante dans le tampon,
et si sed y trouve une IP précédée d'une tabulation ...
[^] # Re: Réponse sed
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Question sed. Évalué à 2.
sed -nre '/prints\(m_IPaddr\)/{
n;n # saute les deux lignes inutiles
s/[ \t]+//g # supprime les espaces et tabulations
/^[0-9]{1,3}(\.[0-9]{1,3}){3}$/p # écrit quand le reste ressemble à une IP
}'
[^] # Re: Pas besoin de java
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Recherche_remplace multiple. Évalué à 2.
[^] # Re: Pas besoin de java
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Recherche_remplace multiple. Évalué à 0.
sed -i -e '...' fichiers
sinon la commande va servir d'argument à l'option -i ;
variante : sed -i.old -e ... où -e est facultatif.
[^] # Re: find
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Supprimer une grande quantité de fichiers impossible. Évalué à 3.
fichiers vicieux (qui ne doivent pas se poser ici) --- voir les options
-print0 de find et -0 de xargs.
find /var/qmail/mails/root -type f -exec rm -f {} +
Sans l'option -type f, il faut peut-être reconstituer les trois
sous-répertoires cur, new et tmp et vérifier leurs permissions.
La remarque sur l'ancienneté est judicieuse, il serait bon de lire
quelques messages récents avant de tout nettoyer ;).
# On peut omettre grep (et head)
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message killer n processus. Évalué à 2.
ps -ef | awk '
/[8]010/{print $2}
NR>10{exit}
' | xargs kill -9
va tuer les dix premiers d'une seule rafale...
(le truc du [8] évite le suicide d'Awk).
[^] # Re: md5sum
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Je cherche logiciel pour comparer les photos. Évalué à 1.
seulement ses méta-données : si on fait la chasse aux doublons,
il vaut mieux éviter de perdre des informations, mais on peut aussi
vouloir les regrouper dans un même fichier.
Tant qu'on se contente d'ajouter des infos, on peut
considérer que l'original est intact.
Garder dans le nom de fichier les quatre chiffres issus de l'APN
peut aussi être utile...
[^] # Re: md5sum
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Je cherche logiciel pour comparer les photos. Évalué à 1.
Malheureusement, la moindre modification d'un champ Exif va fausser le test MD5,
qui ne permet de détecter que les doublons stricts.
On peut extraire l'image JPEG seule, par exemple avec jhead, option -purejpg,
voire utiliser l'imagette incorporée, qui pourrait tolérer de légères modifications, et allégera un peu le travail de md5sums.
M'enfin, quand il ne faut pas régénerer l'imagette...
# html-helper-mode
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Emacs et html. Évalué à 3.
On peut aussi commencer à écrire la balise ouvrante, puis ESC TAB pour la compléter, ajouter la fermante et ramener le curseur entre les deux...
[^] # Re: for letter in a b c d e f
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Equivalent boucle for ?. Évalué à 4.
les fainéants préfèreront taper for letter in {a..z} ; do ....
Les > "$LIST" ne sont pas très utiles, seul celui des z survivra...
Le cat "$LIST" | afio ... est un « UUOC », on peut le remplacer par un < "$LIST" afio ... : j'utiliserais plutôt un seul pipe, avec si besoin l'étape supplémentaire find ... | tee -a "$LIST" | afio ... pour garder une copie de la liste (ou des "${LIST}_$letter").
Par ailleurs certaines lettres pourraient être absentes, on peut le tester :
[ "$(printf '%s' /home/${letter}*)" != "/home/${letter}*" ] && find ....
[^] # Re: Boucle for
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Conversion multiple avec imagemagick. Évalué à 3.
L'appel à Sed est inutile, le shell (Bash, Zsh, ...) sait modifier ses variables, qu'il vaut mieux protéger en cas d'espaces :
convert "$i" -resize -40x640 "Image${i#Photo}"
On peut aussi n'appeler qu'une seule instance de mogrify pour éviter la boucle, en rusant sur l'extension :
mogrify -format jpeg -resize 640x640 '*.jpg'
[^] # Re: Sed&Awksontézamis
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message chiffre en lettre. Évalué à 2.
J'aime beaucoup avec awk. Un jour peut-être, je lirais la doc :-)
Elle est tout de même plus longue que celle de Sed :)
Ma question à deux balles: tu utilises awk "en vrai" ou c'est juste pour le plaisir de l'exemple ?
Oui, je l'utilise --- Awk est parfois très concis, par exemple iptables -nvL | awk '$1'
ou un uniq sans tri : awk '!n[$0]++'. Il permet aussi d'éviter de piper plusieurs grep.
[^] # Re: Sed&Awksontézamis
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message chiffre en lettre. Évalué à 1.
# echo '0 2 54 fg1t 564.9' | sed -n '/0/ {s/0/zero/}; /1/ {s/1/un/}; /2/ {s/2/deux/}; /3/ {s/3/trois/}; /4/ {s/4/quatre/}; /5/ {s/5/cinq/}; /6/ {s/6/six/}; /7/ {s/7/sept/}; /8/ {s/8/huit/}; /9/ {s/9/neuf/}; p'
zero deux cinqquatre fgunt 5six4.neuf
S'amuser en root, c'est Mal(C)...
$ echo '0 2 54 fg1t 564.9' | sed -e '
/0/ s//zero/g
/1/ s//un/g
/2/ s//deux/g
/3/ s//trois/g
/4/ s//quatre/g
/5/ s//cinq/g
/6/ s//six/g
/7/ s//sept/g
/8/ s//huit/g
/9/ s//neuf/g
'
zero deux cinqquatre fgunt cinqsixquatre.neuf
et avec Awk :
awk '
BEGIN{
split("un deux trois quatre cinq six sept huit neuf",L);
L[0]="zéro";
}
/[0-9]/{
for(n=0;n<10;n++){gsub(n,L[n])}
print;
}'
Ca me fait penser à une question entendue dans je ne sais quel jeu télévisé: quel est le chiffre inscrit sur le maillot de tel
joueur de foot ? Le candidat répond à toute vitesse 1 2 3 4 5 6 7 8 9. Nan nan la réponse était 11 :-)
Ben, dans l'équipe B, ils ont des numéros hexadécimaux ?
OK, -->[]
[^] # Re: à l'ancienne
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message inserer des lignes en debut de fichier. Évalué à 1.
Par ailleurs, la commande 1i... va se retrouver comme argument de l'option -i, il faut insérer -e entre l'option -i sans argument et la commande Sed.
La première solution est évidemment plus simple (et plus lisible :), mais on peut, avec l'aide de Bash, emboîter deux (GNU) Seds :
~ $ sed -i.old -e '1{h;r '<(sed -e '/^t/,$!d' fic2)'
d};2{x;G}' fic1
~ $ cat fic2
=== fic2 ===
alpha
bravo
tagada
delta
~ $ diff fic1.old fic1
0a1,3
> tagada
> delta
>
# Find et Awk
Posté par Jacques L'helgoualc'h (site web personnel) . En réponse au message Comptage nombre de fichier en arborescence. Évalué à 2.
find repert/ -maxdepth 3 -mindepth 3 -type f | \
awk '
{
sub("/[^/]+$","");
n[$0]++;
}
END{
if(NR){
for(k in n){
s=s","n[k];
}
}
sub("^,","",s);
print s;
}
'