Script shell bash sur un texte
cette ligne doit se situer au milieu d'un texte déjà constitué d'un fichier existant , par exemple :
ligne 1
ligne2
nouvelle ligne
ligne 3
ligne4
on doit le faire sans utiliser les commandes sed et awk , en calculant les lignes ; j'ai fait comme ceci mais ça plante
lignes= wc -l $2 | cut -c1
milieu= $(($lignes/ 2))
si vous avez des idées , merci
Configuration: Windows XP Firefox 1.5.0.11
54 réponses
L’objectif consiste à insérer une ligne fournie en premier argument dans le milieu d’un fichier texte existant, sans recourir à sed ni awk, en calculant dynamiquement le point médian. La solution consiste à calculer le milieu à partir du nombre de lignes, puis à assembler le fichier avec head et tail autour de la ligne fournie, insérée entre les deux parties. Par exemple, on peut décrire le procédé comme le calcul du milieu puis la composition du fichier avec head et tail et l’insertion est effectuée via une redirection vers un fichier intermédiaire. En pratique, il peut être utile d’utiliser un fichier temporaire et de vérifier les permissions ou d’ajuster le calcul du milieu si le fichier est hybride (lignes vides, retours chariot).
-
ModérateurSalut,
pourquoi pasroot@debian:~# cat ccm.sh #!/bin/bash a=$(ls -l $1 | cut -d' ' -f1) b=${a//[rwx]/"\toui\t"} aa=${b//-/"\tnon\t"} user=$(ls -l $1 | cut -d ' ' -f3) groupe=$(ls -l $1 | cut -d ' ' -f4) u=${aa:7:21} g=${aa:21:21} o=${aa:42:21} echo -e " \t\t\tread\t\twrite\t\texecute" echo -e "user $user\t$u\ngroupe $groupe\t$g\nautres\t\t$o" root@debian:~# sh ccm.sh ccm.sh read write execute user root oui oui non groupe lami20j non oui non autres non oui non root@debian:~# -
Vous m'avez grillé encore une fois! je me demandais comment faire, éventuellement, pour utiliser users, une seule fois, mais je galérais...
Mais j'avoue, je ne pensais pas que faire comme cela était possible, faisable ....
Merci pour votre compétition intelligente et profitable
a+
ps : encore du boulot ! -
ModérateurSalut,
on peut faire aussi comme ça(sort /etc/passwd && echo "Numbers of words = $(cat /etc/passwd | wc -w)") > users
-
merci jipi !
j'étais tellement cassé, que je n'ai même pas fait attention ! il s'agit de mots et non de lignes !
oui, d'après le texte, ce sont les users ! estc-e que je peux couper comme cat /etc/passwd |cut -d" " -f1?! mais je n'obtiens pas que les users. normalement avec cut, il coupe et affiche dans ce cas, le premier champ...
xxxx.xxxx:x:1722:100:xxxx
ccccccc.mmmmm:x:1723:100:ccccccc+mmmm
fffffff.bbbbb:x:1724:100:ffffff+bbbbb
copier le texte du problème, autant que possible, ça aide!
dans ma tête, je pensais lignes ...
belle solution ! très esthétique !
rem.: je suis encore battu !!!
merci
a+ -
Modérateur
sort /etc/passwd > users && echo "Numbers of words = $(cat /etc/passwd | wc -w)" >> users
Problèmes :
Now obtain a list of users from the /etc/passwd file
Une liste, que des noms ? Si oui, il faut couper un peu alors ;-))
Count the number of words in this file and append the answer to the end of the file as ‘Total number of words =
Couper ou pas, on obtient le même nombre de mots à partir du moment où un mot est considéré séparé de son voisin par un espace ou un début de ligne ou une fin de ligne et là les lignes sont entières ;-))
-
hi !
je l'ai eu, ce petit salopard ! pas tout à fait! après test et test, il m'a toujours ...
ls -l yo |wc -l | echo tni: $(wc -l) >> yo
résultat : cat yo
ooooooo
tni:1 (execution 1x)
tni:1 ( " 2x)
tni:1 ( " 3x)
-------------------------------
rem.: il devait me compter
1. tni:2 (pr 2x)
2. tni:3 (pr 3x)
la recherche continue
some help
a+ -
J'ai toujours un peu peur quand lami et jipi s'y mettent !
C'est du grand art! Ca me donne encore du travail et du travail ! mais c'est pour la bonne cause ...
merci à toi, lami!
salut à toi, hug!
merci à tous (aussi bien ceux qui proposent que ceux qui se décarcassent pour comprendre, en passant des nuits entières parfois...!)
le problème du jour est à venir, plus tard ...
pour l'instant, je m'emmerde sur un petit truc de rien du tout, je le sais! mais je n'arrive pas le faire .
exo:
Now obtain a list of users from the /etc/passwd file, sort it and then redirect it to a new file called ‘users’. Count the number of words in this file and append the answer to the end of the file as ‘Total number of words = ‘
cmd : cat /etc/passwd | sort > users
cmd : wc -l < users | cat - users 'il faut récupérer ce nombre et l'ajouter à la fin du mois : classique! or, là je rajoute le nombre par le libellé qui vient avant !
mais dans ce cas, il faut ajouter avant : ‘Total number of words = ‘ alors, bien sûr, echo ‘Total number of words = ‘, et récupérer par une variable le nombre, peut-être ? Mais je pense que c'est plus simple que cela .
ou aussi cat /etc/passwd |sort > users | cat users | wc -l : on obtient le nombre : mais et après !?
help!
merci d'avance -
ModérateurRe,
j'ai un peu du mal avec cette ligne là
u=${aa:7:21} g=${aa:21:21} o=${aa:42:21}
ben, tu n'avais qu'à mettre des echo pour afficher le contenu, comme ça tu comprendras mieux ;-)root@debian:~# cat ccm.sh #!/bin/bash a=$(ls -l $1 | cut -d' ' -f1) echo "a = $a" b=${a//[rwx]/"\toui\t"} echo "b = $b" aa=${b//-/"\tnon\t"} echo "aa = $aa" user=$(ls -l $1 | cut -d ' ' -f3) groupe=$(ls -l $1 | cut -d ' ' -f4) u=${aa:7:21} g=${aa:21:21} o=${aa:42:21} echo "u = $u" echo "g = $g" echo "o = $o" echo echo -e " \t\t\tread\t\twrite\t\texecute" echo -e "user $user\t$u\ngroupe $groupe\t$g\nautres\t\t$o" root@debian:~# sh ccm.sh ccm.sh a = -rw-r--r-- b = -\toui\t\toui\t-\toui\t--\toui\t-- aa = \tnon\t\toui\t\toui\t\tnon\t\toui\t\tnon\t\tnon\t\toui\t\tnon\t\tnon\t u = \toui\t\toui\t\tnon\t g = \tnon\t\toui\t\tnon\t o = \tnon\t\toui\t\tnon\t read write execute user root oui oui non groupe lami20j non oui non autres non oui non root@debian:~#
-
Bin disons que je préférais trouvé une soluce que je comprenne :))))) j'ai un peu du mal avec cette ligne là
u=${aa:7:21} g=${aa:21:21} o=${aa:42:21}
je comprend pas trop à quoi corresponde le aa, les chiffres, les "t" j'imagine que ça représente un espace ou quelque chose du genre mais sans plus, ceci dit je pense que je vais un peu me casser la tête dessus pour essayer de comprendre tout ça, car au moins, dans ta soluce, c'est aligné... :)))))))
Par contre je me demandais si il n'était pas possible de " fusionner" ces deux variables: gr=${gr//[-]/NO" "} ${gr//[rwx]/YES" "} pour les mettre sur la même ligne?
me suis casser la tête dessus hier mais pas trouvé!
merci. -
salut à tous !
J'espère que vous allez bien ...?!
Ce que j'apprécie ici, dans la recherche des solutions, c'est finalement, l'esthétique ! et pas seulement le caractère fonctionnel ...
C'est le cas, aujourd'hui, de Hug, pour cette solution, qui après bien des remaniements, atteint, à un certain ordre, appréciable, préférable. tu fais apparaitre, les droits (rwx) dans le script même, çà, c'est mieux ! c'est plus transparent et rend plus facile la lecture et la compréhension...
Il manque certes, juste, à aligner 'execute' ( ou les valeurs sur le titre de la colonne) sur sa colonne! Mais c'est déjà fortement appréciable!
Merci à toi hug!
cela me donne plus de boulot (forcément!) et me montre le chemin à faire ...encore !
merci à tous
a+ -
salut à tous !
J'espère que vous allez bien ...?!
Ce que j'apprécie ici, dans la recherche des solutions, c'est finalement, l'esthétique ! et pas seulement le caractère fonctionnel ...
C'est le cas, aujourd'hui, de Hug, pour cette solution, qui après bien des remaniements, atteint, à un certain ordre, appréciable, préférable. tu fais apparaitre, les droits (rwx) dans le script même, çà, c'est mieux ! c'est plus transparent et rend plus facile la lecture et la compréhension...
Il manque certes, juste, à aligner 'execute' ( ou les valeurs sur le titre de la colonne) sur sa colonne! Mais c'est déjà fortement appréciable!
Merci à toi hug!
cela me donne plus de boulot (forcément!) et me montre le chemin à faire ...encore !
merci à tous
a+ -
j'ai trouvé ça, ya juste que c'est pas fort alligné, pour changer.....
#!/bin/bash on=$(ls -l $1 | cut -d" " -f3) ; gn=$(ls -l $1 | cut -d" " -f4) ow=$(ls -l $1 | cut -c2-4) ; gr=$(ls -l $1 | cut -c5-7) ; ev=$(ls -l $1 | cut -c8-10) ow=${gr//[-]/NO" "};gr=${gr//[-]/NO" "};ev=${gr//[-]/NO" "} echo " READ WRITE EXECUTE" echo OWNER $on ${ow//[rwx]/YES" "} echo GROUP $gn ${gr//[rwx]/YES" "} echo EVERYBODY ${ev//[rwx]/YES" "}
resultatREAD WRITE EXECUTE OWNER hugues.guerard YES NO YES GROUP users YES NO YES EVERYBODY YES NO YES -
J'ai un début de solution pour faire plus court mais je ne trouve pas le moyen de remplacer les "-" par NO, besoin d'aide svp. :)
on=$(ls -l $1 | cut -d" " -f3) ; gn=$(ls -l $1 | cut -d" " -f4) ow=$(ls -l $1 | cut -c2-4) ; gr=$(ls -l $1 | cut -c5-7) ; ev=$(ls -l $1 | cut -c8-10) echo " " READ WRITE EXECUTE echo OWNER $on " " ${ow//[rwx]/yes" "} echo GROUP $gn " " ${gr//[rwx]/yes" "} echo EVERYBODY " " ${ev//[rwx]/yes" "}
Par contre ce n'est pas du tout aligné....
voilà ce que ça donneREAD WRITE EXECUTE OWNER hugues.guerard yes yes yes GROUP users yes -yes EVERYBODY yes -yes -
salut à tous !
Vous dormez déjà certainement et forcément! (demain, c'est lundi!)
Mais moi, je me bats encore avec les solutions proposées ....!
En particulier, la solution de hug, qui je ne sais par quel merveilleux hasard (?)! fonctionne, mais à quel prix, sur ce script (voir plus bas)!
ce qui est extraordinaire ! c'est qu'il affiche le login comme l'exo, le réclame, mais après, les erreurs arrivent à la volée!
Eh bien, l'origine de cela est le manque de commandes dans la boucle" if ...then" ! alors, j'avoue, je n'arrive pas à m'expliquer comment cela peut marcher. Toutefois, je ne peux me contenter du résultat attendu, avec des erreurs ...
alors, la recherche continue
merci à tous
a+
log:
permissions: line 39: [[-: command not found
permissions: line 43: [[r: command not found
permissions: line 47: [[-: command not found
permissions: line 51: [[-: command not found
script : on passe un fichier simple en argument
#!/bin/bash
#write a script named 'permissions' that takes a file
#as an argument.
#the script should be able to determine
#determine what permissions the owner, group and everybody
#has for the file passed in
on=$(ls -l $1 | cut -d" " -f3)
gn=$(ls -l $1 | cut -d" " -f4)
gr=$(ls -l $1 | cut -c5)
gw=$(ls -l $1 | cut -c6)
ge=$(ls -l $1 | cut -c7)
er=$(ls -l $1 | cut -c8)
ew=$(ls -l $1 | cut -c9)
ee=$(ls -l $1 | cut -c10)
if -r $1
then or="YES"
else or="NO"
fi
if -w $1
then ow="YES"
else ow="NO"
fi
if -x $1
then oe="YES"
else oe="NO"
fi
if $gr = "r"
then grr="YES"
else grr="NO"
fi
if $ow = "w"
then grw="YES"
else grw="NO"
fi
if $ge = "x"
then gre="YES"
else gre="NO"
fi
if $er = "r"
then evr="YES"
else evr="NO"
fi
if $ew = "w"
then evw="YES"
else evw="NO"
fi
if $ee = "x"
then eve="YES"
else eve="NO"
fi
echo READ WRITE EXECUTE
echo OWNER $on $or $ow $oe
echo GROUP $gn $grr $grw $gre
echo EVERYBODY $evr $evw $eve
résultat :
READ WRITE EXECUTE
OWNER moi YES YES NO
GROUP users YES NO NO
EVERYBODY NO NO NO -
J'ai trouvé l'autre bout, hug.
gr=$(ls -l $1 | cut -c5) #dans l'ordre de réception
if [ [ $gr = "r" ]]
then grr="YES"
else grr="NO"
fi
Owner:
on=$(ls -l $1 | cut -d" " -f3)
Group:
gn=$(ls -l $1 | cut -d" " -f4)
Je vais essayer de 'monter' tout cela et voir ce que cela donne; mais j'aurais préféré de loin, qu'on me propose un début ou une solution, à partir de ce script là, pris à jipi:
------------------------------------------------
#! /bin/bash
var=$(ls -l "$1" | cut -d" " -f1)
owner=$(echo "$var" | cut -c2-4)
group=$(echo "$var" | cut -c5-7)
everybody=$(echo "$var" | cut -c8-10)
echo -e "$owner\n$group\n$everybody" > fichier.txt
echo "read write execute"
i=1
while read line
do
if [ "$i" == 1 ]
then param=owner
elif [ "$i" == 2 ]
then param=group
else param=everybody
fi
case "$line" in
---) echo "$paramt non non non"
;;
--x) echo "$param non non oui"
;;
-w-) echo "$param non oui non"
;;
-wx) echo "$param non oui oui"
;;
r--) echo "$param oui non non"
;;
r-x) echo $param oui non oui"
;;
rw-) echo "$param oui oui non"
;;
rwx) echo "$param oui oui oui"
;;
esac
i=$(expr $i + 1)
done < fichier.txt
--------------------------------------
Merci d'avance
a+ -
Salut à tous !
Toujours ce petit casse-tête ...
Hug,
Pourrais-tu me renvoyer l'ensemble de ton script au sujet des permissions: avec le problème de login à afficher. tu me la donné, en deux temps. je n'arrive pas à trouver l'autre bout.
Par ailleurs, le dernier script sur les parenthèses...fonctionne bien! (si j'avais oublié de le dire )
Jipi, Lami,
Vous pouvez peut-être donner un coup de pouce !?
Merci d'avance
a+ -
hi!
hug, ça marche ! je ne sais pas pourquoi! je n'ai pas encore trouvé ce cas, dans mon matériel pédagogique. j'essaye de comprendre ...
il me reste mon login name! nom de dieu !
merci
a+ -
Oui je vais allé me pieuter mais je te donne quand même une petite soluce pour le nom du owner et du groupe:
Owner: on=$(ls -l $1 | cut -d" " -f3) Group: gn=$(ls -l $1 | cut -d" " -f4)
Bon, ad'taleur :)) bonne nuité. -
je croyais que tu dormais déjà!
bon j'essaye !
Pour le script de jipi, si tu peux donner un coup de main! j'essaye de faire apparaitre le login name. jipi , doit dormir à cette heure!
J'ai pensé mettre $USER pour récupérer, le login name. Mais toujours rien. je l'ai mis dans owner, après "$var $USER", puis dans echo, après $owner, toujours rien!
mais il est temps pour toi, d'aller au lit, je pense ! alors à demain !
#! /bin/bash
var=$(ls -l "$1" | cut -d" " -f1)
owner=$(echo "$var $USER" | cut -c2-4)
group=$(echo "$var" | cut -c5-7)
everybody=$(echo "$var" | cut -c8-10)
echo -e "$owner\n$group\n$everybody" > fichier.txt
echo "read write execute"
i=1
while read line
do
if [ "$i" == 1 ]
then param=owner
elif [ "$i" == 2 ]
then param=group
else param=everybody
fi
case "$line" in
---) echo "$paramt non non non"
;;
--x) echo "$param non non oui"
;;
-w-) echo "$param non oui non"
;;
-wx) echo "$param non oui oui"
;;
r--) echo "$param oui non non"
;;
r-x) echo "$param oui non oui"
;;
rw-) echo "$param oui oui non"
;;
rwx) echo "$param oui oui oui"
;;
esac
i=$(expr $i + 1)
done < fichier.txt
merci pour les conseils!
a+ -
Ah oui j'ai oublié un truc... essaye ça
cat xx | grep $USER$ | nl -s')'
et voila le résultat
1)USER=hugues.guerard
2)MAIL=/var/spool/mail/hugues.guerard
3)PWD=/home/hugues.guerard
4)HOME=/home/hugues.guerard
5)LOGNAME=hugues.guerard
6)USER=hugues.guerard
7)MAIL=/var/spool/mail/hugues.guerard
8)PWD=/home/hugues.guerard
9)HOME=/home/hugues.guerard
10)LOGNAME=hugues.guerard
........
Je ne sais pas pourquoi mais en rajoutant un $ a la fin ça marche, donc là si le jeune jipicy :)))) ou lamij20 peux nous expliquer ça m'arrangerait un p'tit peu!!!
Pour le séminaire, comme je t'ai dit, va voir mon script du pendu, c'est ce qu'ils m'ont demandé ( je l'ai juste un peu amélioré ) y a 3 mois lors du test, mais tu as l'air de bien t'en sortir et de savoir ce que tu fais, pas comme moi au début, si tu bosses bien tu passeras le séminaire sans problèmes!
En attendant, on vas s'entraider ici! ;))) Aussi, tu n'es pas obligé de réussir l'exercice qu'il nous seras proposé, même si il ne marche pas tu peux quand même être sélectionné, bon bin dans mon cas j'ai pas mal merdé mais bon ils m'ont laissé une chance ;).
- 1
- 2
- 3