Filtrování řádků z výpisu fstab

webhope

Filtrování řádků z výpisu fstab
« kdy: 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?

« Poslední změna: 17. 03. 2010, 09:37:54 od webhope webhope »


NN

Re: Filtrování řádků z výpisu fstab
« Odpověď #1 kdy: 17. 03. 2010, 10:07:13 »
Kód: [Vybrat]
grep -e ext3 -e ext2 -e ntfs-3g /etc/fstab
NN

webhope

Re: Filtrování řádků z výpisu fstab
« Odpověď #2 kdy: 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).
« Poslední změna: 19. 03. 2010, 09:24:56 od webhope webhope »

PCnity

  • *****
  • 685
    • Zobrazit profil
    • E-mail
Re: Filtrování řádků z výpisu fstab
« Odpověď #3 kdy: 18. 03. 2010, 17:09:19 »
Posli cely skript. Nie len vysek.

deadmail

Re: Filtrování řádků z výpisu fstab
« Odpověď #4 kdy: 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


webhope

Re: Filtrování řádků z výpisu fstab
« Odpověď #5 kdy: 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.
« Poslední změna: 19. 03. 2010, 09:21:34 od webhope webhope »

deadmail

Re: Filtrování řádků z výpisu fstab
« Odpověď #6 kdy: 19. 03. 2010, 20:37:20 »
Citace
Chtěl jsem do selectu dostat řádky z fstabu

presne to robi ten moj kod

webhope

Re: Filtrování řádků z výpisu fstab
« Odpověď #7 kdy: 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  ;) )
« Poslední změna: 28. 03. 2010, 15:10:19 od webhope webhope »

deadmail

Re: Filtrování řádků z výpisu fstab
« Odpověď #8 kdy: 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 " ".

webhope

Re: Filtrování řádků z výpisu fstab
« Odpověď #9 kdy: 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.
« Poslední změna: 29. 03. 2010, 10:59:58 od webhope webhope »

deadmail

Re: Filtrování řádků z výpisu fstab
« Odpověď #10 kdy: 29. 03. 2010, 12:16:25 »
abecedne/ciselne?

Kód: [Vybrat]
sort -n

webhope

Re: Filtrování řádků z výpisu fstab
« Odpověď #11 kdy: 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.
« Poslední změna: 29. 03. 2010, 12:25:41 od webhope webhope »

branchman

Re: Filtrování řádků z výpisu fstab
« Odpověď #12 kdy: 29. 03. 2010, 14:37:38 »
Kód: [Vybrat]
man sort
Aneb sort má aj option -n.

webhope

Re: Filtrování řádků z výpisu fstab
« Odpověď #13 kdy: 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

deadmail

Re: Filtrování řádků z výpisu fstab
« Odpověď #14 kdy: 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"