Portál AbcLinuxu, 16. července 2025 15:18


Dotaz: regularni vyraz v awk

21.5.2005 00:46 Roland | skóre: 3
regularni vyraz v awk
Přečteno: 377×
Odpovědět | Admin
Dobry den, nejak si nevim rady s regularnim vyrazem v awk. Z vypisu ls -Rl potrebuji zjistit ktery radek zacina znakem [ nebo . a podle toho se zachovat

ls -Rl `$pwd` | grep -v ^celkem | grep [^*] | awk '{if (($1 == "[^[]") || ($1 == "[^\.]") {print $1} else {print $9}}'

za rady dekuji
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.5.2005 08:06 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: regularni vyraz v awk
Odpovědět | | Sbalit | Link | Blokovat | Admin
To je zase nějaká domácí úloha na reimplementaci findu v awk? Pokud ne, použij find.

Jinak, kde začít...

Co to je proboha `$pwd` a proč tam je? Nemá to být $PWD, když tedy už vůbec ls potřebuje argument?

grep ... | grep ... | awk má v soutěži o nejzbytečnější grep slušnou naději na umístění na čelní posici.

grep -v ^celkem funguje leda s českým locale, jinak tam lze slovo celkem stěží očekávat.

[^*] se expanduje na co? Na seznam jednopísmenných souborů v adresáři, které se nejmenují *. Jinými slovy nepředvídatelně.

awk. Přečti si Getting started with awk v manuálu. Chceš totiž ve skutečnosti

/[^[]/ { ... }

neboli

PATTERN { ACTION }

takhle se awk běžně používá.

A Expressions. Operátor == je totiž porovnání řetězců, kdybys už chtěl matchovat regulární výrazy, tak se matchují operátorem ~.
21.5.2005 12:16 Roland | skóre: 3
Rozbalit Rozbalit vše Re: regularni vyraz v awk
"Jedna se o silenou soutez na CVUT FEL jmenem: Napis si svuj FIND aneb semestralni uloha z X36UNX..."

1. grep ^celkem, no muzu tam dat total nebo vzit v potaz x-dalsich mutaci unixu a linuxu - me staci kdyz to predvedu na jednom stroji, stejne je to nesmysl takto psat find...
2. [^*] odstrani prazdne radky
3. takze to bude vypadat nejak takto? awk '{if (($1 == "/[^[]/") || ($1 == "/[^\.]/") {print $1} else {print $9}}'
4. na Solarisu mi fungovalo awk '{if ($1 == "[^/*]"){print $9} if ($1 == "[^/]") {print $1}}'

jde mi jen o to rozlisit z vystupu ls -RL jestli se jedna o "cestu" nebo adresar a soubor
21.5.2005 12:16 Michal Kubeček
Rozbalit Rozbalit vše Re: regularni vyraz v awk
To je zase nějaká domácí úloha na reimplementaci findu v awk?

Řekl bych, že pořád ta samá… Nejlepší stejně asi bude z toho shellového skriptu spustit awk a z něj nenápadně zavolat find… :-)

Zajímalo by mne jen, zda cena takto naprogramovaného find (strávený čas krát nějaká rozumná hodinová sazba) přesáhne cenu, za kterou se prodávají RHEL, SLES nebo Solaris… :-)

21.5.2005 12:39 Roland | skóre: 3
Rozbalit Rozbalit vše Re: regularni vyraz v awk
Jsem rad ze vas tu alespon pobavim :)

Ale opravdu nevite jak na ten regularni vyraz? Potrebuji, aby se na vsechny radky co zacinaji '.' nejak zereagovalo...
21.5.2005 12:54 Michal Kubeček
Rozbalit Rozbalit vše Re: regularni vyraz v awk
Už jsem vám napsal několikrát, že metodu parsování výstupu 'ls -lR' považuji za naprosto nevhodnou a že daleko vhodnější by bylo řešit to rekurzivním procházením adresářového stromu. Ale komu není rady, tomu není pomoci…

Ale jinak v tom nevidím problém:

ls -lR | awk '/^\./ { print "hele, tečka!"; }'

21.5.2005 13:16 Roland | skóre: 3
Rozbalit Rozbalit vše Re: regularni vyraz v awk
Dekuji!
Asi jsem vase vyzvy ve zmeti zprav prehledl, zkusim si o rekurzivnim procházeni adresaroveho stromu neco vyhledat. Kdybyste mel nejaky zajimavy link, byl bych za nej rad...
21.5.2005 13:57 Michal Kubeček
Rozbalit Rozbalit vše Re: regularni vyraz v awk
Na to není potřeba nic hledat, lehký nástřel:

function recurse
{
  for f in *; do
    # tady s tím souborem něco udělám
    if [ -d "$f" ]; then
      cd "$f"
      recurse
      cd ..
    fi
  done
}

Samozřejmě to bude chtít trochu doladit (prázdné adresáře, skryté soubory, zacyklené linky, …).

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.