Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: webhope 17. 03. 2010, 09:09:20
-
Chtěl bych jeden skript obohatit o možnost úpravy jedné řádky v /etc/fstab . Získal jsem číslo uuid, oddílu, který není připojen (problem je ale, že toto uuid v fstab stejně není). A chtěl bych z fstabu vytáhnout pouze řádky, které obsahují buď "ntfs-3g" nebo "ext3" nebo "ext2". Nevíte jak na to?
-
grep -e ext3 -e ext2 -e ntfs-3g /etc/fstab
NN
-
V podstatě jde o to, že ze zadaného kódu tento příkaz jasně ukáže, že pole je nastaveno (resp. jeho jednotlivé elementy):
arr[$n]="$line"; echo ${arr[n]};
Když to ale testuji několika různými způsoby, s IFS=$"\n" tak to přesto nejde, pole není nastaveno a ukazuje délku 0:
old=$IFS; IFS=$'\n';
echo "${#arr[*]}"; read # "#" before array name returns the number of elements for the array host.
echo "${arr[*]}"; read # "#" before array name returns the number of elements for the array host.
echo "${arr[@]}"; read # "#" before array name returns the number of elements for the array host.
IFS=$old;
Fakt už nevím co s tím.
A toto je kód se kterým pracuju:
hledat=("NTFS" "Linux" "Oba" "Vynechat tento krok");
select hledam in "${hledat[@]}"; do
case $hledam in
${hledat[0]}) e=" -e ntfs-3g ";t="NTFS";;
${hledat[1]}) e=" -e ext2 -e ext3 ";t="EXT";;
${hledat[2]}) e=" -e ntfs-3g -e ext3 -e ext2 ";t="EXT";;
${hledat[3]}) break;;
esac;
if [ -n "${hledam}" ]; then
grep $e /etc/fstab | while read line; do
let "n += 1"
arr[$n]="$line"; # echo ${arr[n]};
done
echo "${arr[@]}"; read
echo "Vyber radek k editaci"
if [ "$t"=="EXT" ]; then echo " (/ a /home nelze editovat)."; else echo "."; fi;
select array in "${arr[@]}"; do echo "hi";
done
break;
fi;
done
To pole arr má být hlavně přístupné tomu selectu na konci
Edit: Kódu předchází jen dotaz na to, jaký filesystem chcete editovat (připojit).
-
Posli cely skript. Nie len vysek.
-
Skuste:
arr=$(grep $e /etc/fstab)
OLDIFS=$IFS
IFS=$'\n'
select array in $arr
do
echo "hi $array"
done
IFS=$OLDIFS
vid diskusia k inemu skriptu (http://www.root.cz/diskuse/4827/)
-
Díky za reakci, ale jsem to už raději vyřešil jinak. Šlo mi o to, editovat jednu řádku v fstabu. Chtěl jsem do selectu dostat řádky z fstabu. Ale pak jsem o tom začal pochybovat, že by to vůbec šlo, takže jsem to udělal přes cyklus
grep $e /etc/fstab | while read line; do ... done;
Akorád jsem ten cyklus musel použít víckrát za sebou. Jednou pro výpis řádků, podruhé pro výběr. PCnity: Na přiložený köd se ještě podívám. Teď řeším jak vytvořit předlohu, která najde starý řádek. Předlohu vytvářím pomocí awk a potřebuju do výstupu awk dostat zástupný znak whitespace. Vytvořím na to nové téma.
-
Chtěl jsem do selectu dostat řádky z fstabu
presne to robi ten moj kod
-
Teď zpracovávám ještě jeden podobný script, který z předchozího vychází. Akorád že nejdříve udělám výpis blkid. což je strukturou podobné na výpis z fstab. To na čem teď pracuju je toto: 1) vyber řádku z blkid (tj. oddíl) a 2) dosaď ho do fstab. Jako, měl bych to zvládnout, to není problém.
Jde o to, že bych chtěl uspořádat ten výpis blkid, aby ty zařízení byly seřazeny abecedně, tedy jednotlivé oddíly jak jdou za sebou.
Tedy v současnosti mám toto:
arr=$(blkid | grep $t)
OLDIFS=$IFS; IFS=$'\n'; clear;
select array in $arr
do
echo "$array"; break;
done
IFS=$OLDIFS
read
(To je ten deadmailův select ;) )
-
Za grepom potom treba spustit sort, aby sa to utriedilo podla cesty.
Vo fstab sa to da jednoducho podla druheho pola:
grep "ext." /etc/fstab| sort -k2,2
Problem by mohol nastat ak medzi prym a druhym polom je viac medzier (ako napr vo vypise ls -l pred polom velkost) - to sa da riesit zlucenim cez tr -s " ".
-
Tak to je fakt skvělé, že to jde tak jednoduše. Já myslel, že to bude musel být přes nějaký cyklus. Dík
Edit:
Ale je tam problém. Ty zařízení jsou seřazeny abecedně, nikoliv číselně (mám tam hodně oddílů, takže výsledku je to chaos).
Mám nápad jak by se to dalo uspořádat. Výstup z grepu profiltrovat pomocí sedu a "/dev/sda" nebo "/dev/sda" dosadit mezeru. pak pipeline, seřadit to podle druhého sloupce, pak zase pipeline a tu mezeru zase odstranit. Ale nevím jak na ten sed.
-
abecedne/ciselne?
sort -n
-
Já vím, zkoušel jsem. Výsledek je stejný:
1) /dev/sda1: UUID="2090ACC103B52D41"
2) /dev/sda10: UUID="08D575F41160C570"
3) /dev/sda11: UUID="513D27393DAD5EC2"
4) /dev/sda12: UUID="089952DB1103A658"
5) /dev/sda13: UUID="3FBB173B642BEA53"
6) /dev/sda14: UUID="4AFBFA0935512429"
7) /dev/sda15: UUID="27217807508BB075"
8) /dev/sda16: UUID="7845E51D16FF84BF"
9) /dev/sda17: UUID="7531949402B93221"
10) /dev/sda18: UUID="72C2E03E4B14ADA0"
11) /dev/sda19: UUID="03B511C3287F0216"
12) /dev/sda2: UUID="E0D8A16ED8A1441E"
13) /dev/sda20: UUID="5694410F657C599E"
14) /dev/sda21: UUID="17EB9E5B17EF0810"
15) /dev/sda7: UUID="4FC71FC14B14ADA0"
16) /dev/sda8: UUID="4E64923958B30394"
17) /dev/sda9: UUID="58E75A17692994A5"
18) /dev/sdb1: UUID="E0CC96C0CC969080"
19) /dev/sdb2: UUID="4A88460F8845AA49"
20) /dev/sdb3: UUID="5400D41F00D40A3E"
21) /dev/sdb8: UUID="4D0719062D5695DB"
za jedničkou má následovat 2,3,4,5,6,7,8,9,10, atd. ne 1,10,11...2,20... Sort to neinterpretuje jako číslo. Proto jsem navrhoval rozddělit to na dvě části, seřadit podle sloupce 1-2 a zase sloučit.
-
man sort
Aneb sort má aj option -n.
-
Však s čím si myslíš, že celou dobu pracuju?
Info sort
Ale říkám ti, že to na to nemá vliv
-
Treba prejst cely manual a zistite ze vie triedit aj od urciteho znaku v poli... takze ak mame stale /dev/???[0-9]..., tak napr. takto:
echo "/dev/sda10 uuid
/dev/sdb2 blabla
/dev/sdb2 aaaa
/dev/sdb15 qr
/dev/sda3 ..." | sort -n -k "1.9,1" | sort -d --stable -k "1,1.8"
-
Díky, funguje to. Číst umím, ale smysl těch vět z manuálu někdy nechápu. Takžeproč tam je argument -d? Když ho odstraním nic se nestane. --stable taky.
-
prepinac -d je nastaveny defaultne (teda ak sa neuvedie nic sa nezmeni)
prepinac --stable znamena stabilne triedenie. V prvom triedeni sa triedi podla cisla,v druhom podla pismen. Aby vysledok bol ocakavany, tak pri druhom tredeni v pripade rovnosti musia ostat v rovnakom poradi ako po prvom triedeni. Ten vstup v mojom priklade u mna dava rozne vysledky.
Namiesto
$ echo "/dev/sda10 uuid
/dev/sdb2 blabla
/dev/sdb2 aaaa
/dev/sdb15 qr
/dev/sda3 ..." | sort -n -k "1.9,1" | sort --stable -k "1,1.8"
/dev/sda3 ...
/dev/sda10 uuid
/dev/sdb2 aaaa
/dev/sdb2 blabla
/dev/sdb15 qr
to vypise:
$ echo "/dev/sda10 uuid
/dev/sdb2 blabla
/dev/sdb2 aaaa
/dev/sdb15 qr
/dev/sda3 ..." | sort -n -k "1.9,1" | sort -k "1,1.8"
/dev/sda10 uuid
/dev/sda3 ...
/dev/sdb15 qr
/dev/sdb2 aaaa
/dev/sdb2 blabla