Strona 1 z 1

[bash] Grep -A num (jak ominąć niechciany wyraz) / użycie CUT

: 23 mar 2009, 14:35
autor: westmen3
Czesc
Chcialem napisac sobie skrypt do conky'iego, ale natrafilem na haczyk i nie wiem jak sobie poradzic(moja wiedza nt programowania jest znikoma)
Otoz

Kod: Zaznacz cały

grep -A 3 ''Teraz' ~/.scripts/temp | awk '{print}' > ~/.scripts/pogoda1
elegancko sciaga pogode do pliku, ale:
~/.scripts/pogoda1

Kod: Zaznacz cały

Teraz 13-19
                      Temp.:  4 °C [s1]
                      Ciśn.:  1000 hPa [s4] 
        [b12]         Wiatr:  [rw2]27 km/h [s2]
Pytanie nastepujace: jak pozbyc sie [s1] [s4] [rw2] [s2] [b12]
domyslam sie ze sa to ikony z pogoda.onet.pl ;D

Odp: [bash] Grep -A num (jak ominąć niechciany wyraz)

: 23 mar 2009, 17:32
autor: leon1313
Nie wiem, czy sam AWK obsługuje niechciwe dopasowania, PERL natomiast radzi sobie dosyć dobrze z tym tematem.
Trochę od zadniej strony, bo można to wszystko napisać w PERL-u, ale masz:

Kod: Zaznacz cały

grep -A 3 'Teraz' ~/.scripts/temp |perl -lane 's/\[.*?\]//gs;print' > ~/.scripts/pogoda1

Odp: [bash] Grep -A num (jak ominąć niechciany wyraz)

: 23 mar 2009, 20:56
autor: westmen3
leon1313 pisze:Nie wiem, czy sam AWK obsługuje niechciwe dopasowania, PERL natomiast radzi sobie dosyć dobrze z tym tematem.
Trochę od zadniej strony, bo można to wszystko napisać w PERL-u, ale masz:

Kod: Zaznacz cały

grep -A 3 'Teraz' ~/.scripts/temp |perl -lane 's/\[.*?\]//gs;print' > ~/.scripts/pogoda1
Dziekuje za pomoc!
Zastanawiam sie jeszcze nad jedna rzecza jak poleceniem cut mozna wyciac fragment tekstu o "wspolrzednych" wiersz 2, kolumna 3-8. - byc moze to banalne, ale ja jakos nie potrafie tego zrobic :/
Pozdrawiam

Odp: [bash] Grep -A num (jak ominąć niechciany wyraz) / użycie CUT

: 24 mar 2009, 08:07
autor: leon1313
Można , ale lepiej do tego nadaje się AWK lub przy większych projektach PERL

Odp: [bash] Grep -A num (jak ominąć niechciany wyraz)

: 24 mar 2009, 09:44
autor: хur
westmen3 pisze: [...] Zastanawiam sie jeszcze nad jedna rzecza jak poleceniem cut mozna wyciac fragment tekstu o "wspolrzednych" wiersz 2, kolumna 3-8. - byc moze to banalne, ale ja jakos nie potrafie tego zrobic :/ [...]
jeśli chodzi o cut to możliwe że nie zauważyłeś
że domyślnym delimiterem jest tabulacja a to co
chcesz ciąć ma spacje, ustawia się to opcją d.
Btw, wiem jak wyciąć cutem kolumny, ale wiersze to już nie...

Dam parę przykładów, żeby było widać jak co działa
to zrobię przykładową tabelkę którą będę ciął.
Dla wygody zapiszę ją do zmiennej 'tab'.
Wiersze oznaczę dużymi literami, kolumny zaś cyframi.
Tzn. tabelka 5 na 16 wygląda tak:

Kod: Zaznacz cały

echo "$tab"

Kod: Zaznacz cały

A01 A02 A03 A04 A05 A06 A07 A08 A09 A10 A11 A12 A13 A14 A15 A16
B01 B02 B03 B04 B05 B06 B07 B08 B09 B10 B11 B12 B13 B14 B15 B16
C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14 C15 C16
D01 D02 D03 D04 D05 D06 D07 D08 D09 D10 D11 D12 D13 D14 D15 D16
E01 E02 E03 E04 E05 E06 E07 E08 E09 E10 E11 E12 E13 E14 E15 E16
robię ją tak:

Kod: Zaznacz cały

export tab=$(eval seq\ -s\\\ \ -f{A..E}%02g\ 16\;)
przykłady:

Kod: Zaznacz cały

echo "$tab" | cut -d' ' -f3-8

A03 A04 A05 A06 A07 A08
B03 B04 B05 B06 B07 B08
C03 C04 C05 C06 C07 C08
D03 D04 D05 D06 D07 D08
E03 E04 E05 E06 E07 E08

Kod: Zaznacz cały

echo "$tab" | awk NR==2 | cut -d' ' -f3-8

B03 B04 B05 B06 B07 B08

Kod: Zaznacz cały

echo "$tab" | awk NR==2 | cut -d' ' -f3-8 --complement

B01 B02 B09 B10 B11 B12 B13 B14 B15 B16

Kod: Zaznacz cały

echo "$tab" | awk 'NR==2 { while(++i<=NF) printf"%*s",length($i)+1,(i>3&&i<9)?$i" ":""; printf "\n" } NR!=2'

A01 A02 A03 A04 A05 A06 A07 A08 A09 A10 A11 A12 A13 A14 A15 A16
            B04 B05 B06 B07 B08                                 
C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14 C15 C16
D01 D02 D03 D04 D05 D06 D07 D08 D09 D10 D11 D12 D13 D14 D15 D16
E01 E02 E03 E04 E05 E06 E07 E08 E09 E10 E11 E12 E13 E14 E15 E16

Kod: Zaznacz cały

echo "$tab" | awk 'NR==2 { while(++i<=NF) printf"%*s",length($i)+1,(i<4||i>8)?$i" ":""; printf "\n" } NR!=2'

A01 A02 A03 A04 A05 A06 A07 A08 A09 A10 A11 A12 A13 A14 A15 A16
B01 B02 B03                     B09 B10 B11 B12 B13 B14 B15 B16 
C01 C02 C03 C04 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14 C15 C16
D01 D02 D03 D04 D05 D06 D07 D08 D09 D10 D11 D12 D13 D14 D15 D16
E01 E02 E03 E04 E05 E06 E07 E08 E09 E10 E11 E12 E13 E14 E15 E16

Odp: [bash] Grep -A num (jak ominąć niechciany wyraz) / użycie CUT

: 24 mar 2009, 20:17
autor: leon1313
xur, czy używanie jednocześnie cut-a i AWK jest poprawne politycznie ? :-)

Odp: [bash] Grep -A num (jak ominąć niechciany wyraz) / użycie CUT

: 24 mar 2009, 22:34
autor: westmen3
Dziekuje za pomoc, dzieki niej udalo mi sie napisac skrypt pogodynki - z onetu.
Korzystajac z okazji mam jeszcze jeden problemik - bardziej estetyczny.
Otoz Obrazek
tak wyglada skrypt na chodzie juz w conky'm, jak widac nie jest on bardzo przejrzysty i tu nasuwa sie pytanie w jaki sposob mozna zwiekszyc odstep np temperatury od temperatury, albo ogolnie "kolumny" z jednymi danymi od "kolumny" z drugimi
tak wyglada czesc mojego kodu

Kod: Zaznacz cały

 echo 'Dzisiaj, godz.'	$z	$a
 echo 'Temperatura:'	$y 	$b
 echo 'Ciśnienie:'	$x	$c
 echo 'Wiatr:'		$p	$e
 echo 'Śnieg:'		$s	$f
 echo 'Deszcz:'		$d	$g

Odp: [bash] Grep -A num (jak ominąć niechciany wyraz) / użycie CUT

: 25 mar 2009, 00:13
autor: хur
leon1313 pisze:xur, czy używanie jednocześnie cut-a i AWK jest poprawne politycznie ? :-)
to zależy, jeśli chodzi o shellowanie to jestem zwolennikiem anarchizmu epistemologicznego ;>

westmen3, niestety nie wiem co conky robi z białymi znakami,
nigdy tego programu na oczy nie widziałem.

jeśli ich nie "kolapsuje" to wystarczy
pobawić się cudzysłowami:

Kod: Zaznacz cały

echo "Dzisiaj, godz.	$z	$a"
echo "Temperatura:	$y 	$b"
# i tak dalej...
btw ja bym użył raczej czegoś co się nazywa "here document',
poniżej przykład:

Kod: Zaznacz cały

#!/bin/bash

# ustawiam zmiennym z a y b x c p e s f d g losowe wartości,
# tak żeby pokazać jak działa here document

for meta in z a y b x c p e s f d g ; do export ${meta}=$((RANDOM%10)) ; done

cat <<EOF
Dzisiaj, godz.	$z	$a
Temperatura:	$y	$b
Ciśnienie:	$x	$c
Wiatr:		$p	$e
Śnieg:		$s	$f
Deszcz:		$d	$g
EOF
btw z tabulacjami bym uważał. Jeśli conky nie będzie
honorował spacji / tabulacji to możesz wypróbować
spacje "niełamliwe". Podejrzewam też że conky
może mieć jakieś specjalne opcje do layoutu,
ale jak już pisałem nie miałem z nim styczności.