Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: webhope 17. 03. 2010, 09:09:20

Název: Filtrování řádků z výpisu fstab
Přispěvatel: 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?

Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: NN 17. 03. 2010, 10:07:13
Kód: [Vybrat]
grep -e ext3 -e ext2 -e ntfs-3g /etc/fstab
NN
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: webhope 18. 03. 2010, 15:27:30
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):
Kód: [Vybrat]
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:

Kód: [Vybrat]
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:

Kód: [Vybrat]
  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).
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: PCnity 18. 03. 2010, 17:09:19
Posli cely skript. Nie len vysek.
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: deadmail 19. 03. 2010, 05:58:29
Skuste:
Kód: [Vybrat]
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/)
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: webhope 19. 03. 2010, 09:14:02
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
Kód: [Vybrat]
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.
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: deadmail 19. 03. 2010, 20:37:20
Citace
Chtěl jsem do selectu dostat řádky z fstabu

presne to robi ten moj kod
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: webhope 28. 03. 2010, 14:52:38
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:

Kód: [Vybrat]
  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  ;) )
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: deadmail 29. 03. 2010, 05:57:47
Za grepom potom treba spustit sort, aby sa to utriedilo podla cesty.
Vo fstab sa to da jednoducho podla druheho pola:

Kód: [Vybrat]
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 " ".
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: webhope 29. 03. 2010, 10:24:21
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.
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: deadmail 29. 03. 2010, 12:16:25
abecedne/ciselne?

Kód: [Vybrat]
sort -n
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: webhope 29. 03. 2010, 12:23:20
Já vím, zkoušel jsem. Výsledek je stejný:

Kód: [Vybrat]
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.
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: branchman 29. 03. 2010, 14:37:38
Kód: [Vybrat]
man sort
Aneb sort má aj option -n.
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: webhope 29. 03. 2010, 16:50:25
Však s čím si myslíš, že celou dobu pracuju?

Info sort

Ale říkám ti, že to na to nemá vliv
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: deadmail 29. 03. 2010, 17:52:07
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:

Kód: [Vybrat]
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"
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: webhope 29. 03. 2010, 20:40:36
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.
Název: Re: Filtrování řádků z výpisu fstab
Přispěvatel: deadmail 30. 03. 2010, 04:29:06
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
Kód: [Vybrat]
$ 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:
Kód: [Vybrat]
$ 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