Script shell bash sur un texte

Fermé
niceLP - 14 mai 2007 à 16:34
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009 - 12 févr. 2008 à 23:25
j'ai un exo qui consiste à insérer une ligne en premier argument($1)
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
A voir également:

54 réponses

makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012
8 févr. 2008 à 12:15
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+
0
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012
11 févr. 2008 à 03:15
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
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
11 févr. 2008 à 17:34
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 donne
                                              READ WRITE EXECUTE
OWNER hugues.guerard                     yes   yes   yes
GROUP users                        yes  -yes
EVERYBODY                        yes  -yes
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
12 févr. 2008 à 04:04
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"  "}


resultat
                          READ WRITE EXECUTE
OWNER hugues.guerard       YES NO YES
GROUP users                YES NO YES
EVERYBODY                  YES NO YES    
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
12 févr. 2008 à 23:25
petite rectfication de la troisiéme ligne, juste au cas où... -->> ow=${ow//[-]/NO" "};gr=${gr//[-]/NO" "};ev=${ev//[-]/NO" "}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012
12 févr. 2008 à 14:03
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+
0
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012
12 févr. 2008 à 14:03
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+
0
hugnix Messages postés 119 Date d'inscription samedi 9 juin 2007 Statut Membre Dernière intervention 27 avril 2009
12 févr. 2008 à 15:48
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.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 févr. 2008 à 16:05
Re,

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:~#

0
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012
12 févr. 2008 à 17:49
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
0
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012
12 févr. 2008 à 18:20
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+
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 898
12 févr. 2008 à 18:30
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 ;-))
0
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012
12 févr. 2008 à 19:03
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+
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
12 févr. 2008 à 19:21
Salut,

on peut faire aussi comme ça
(sort /etc/passwd && echo "Numbers of words = $(cat /etc/passwd | wc -w)") > users

0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 898
12 févr. 2008 à 19:26
On peut aussi, si on préfère les parenthèses aux chevrons ;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
12 févr. 2008 à 19:31
si on préfère les parenthèses aux chevrons
pas que ça ;-)

comme je suis paresseux j'utilise users une seule fois ;-)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 898 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
12 févr. 2008 à 19:33
Faignasse ;-)))
0
makoko Messages postés 53 Date d'inscription mercredi 6 février 2008 Statut Membre Dernière intervention 25 novembre 2012
12 févr. 2008 à 20:54
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 !
0