Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: compaq 23 Prosince 2011, 01:00:55

Název: Prosím o pomoc se skriptem
Přispěvatel: compaq 23 Prosince 2011, 01:00:55
Jsem laik a potřebuji u všech souborů z GPS Trackeru SONY (*.log) odstranit pro další zpracování v gpsbabel stejný první řádek:

Příklad:

*.log před úpravou
Citace
@Sonygps/ver1.0/wgs-84/gps-cs3.0
$GPGGA,150018,5004.8976,N,01424.9536,E,1,03,05.7,00204.5,M,045.5,M,00,0000*42
$GPGSA,A,2,01,11,23,,,,,,,,,,05.8,05.7,00.9*05

po úpravě
Citace
$GPGGA,150018,5004.8976,N,01424.9536,E,1,03,05.7,00204.5,M,045.5,M,00,0000*42
$GPGSA,A,2,01,11,23,,,,,,,,,,05.8,05.7,00.9*05

Neumím si napsat skript. Pomůže někdo? Díky.
Název: Re:Prosím o pomoc se skriptem
Přispěvatel: Kedrigern 23 Prosince 2011, 02:10:21
Předpokládám, že máš všechny soubory s kterými chceš manipulovat v jedné složce. Dále tak také nesmíš mít jiné s koncovkou log (jinak se jim také umaže řádek). Samozřejmě by to šlo ošetřit, ale to bych ti nenapsal v noci.

Kód: [Vybrat]
#!/bin/bash

for i in *.log ; do                     # cyklus, projde vsechny soubory s priponou log
  sed '1d' "$i" > "${i}.tmp";          # smaze prvni radku a ulozi do noveho souboru (s koncovkou tmp)
  rm "$i" ;                                    # smaze puvodni soubor
  mv "${i}.tmp" "${i}" ;                    # prejmenuje novy soubor na nazev stareho
done;

Čili
1) Tohle (skript) ulož jako prostý textový soubor s koncovkou .sh.
2) Pak si naskládej kopie logů do jedné složky
3) V dané složce si otevři terminál
4) Učiň skript spustitelným (musíš ho mít ve stejné složce):
Kód: [Vybrat]
chmod +x <skript>.sh5) Spusť ho:
Kód: [Vybrat]
./<skript>.sh
Za <skript>.sh vždy doplň název skriptu.

Skript jsem netestoval (nejsem u linuxu), ale pokud si to zkusíš na kopii dat, tak nic nezkazíš.
Název: Re:Prosím o pomoc se skriptem
Přispěvatel: compaq 23 Prosince 2011, 09:44:41
Díky moc. Vyzkouším.

Ještě mě v noci napadlo, jestli neexistuje nějaký příkaz "vezmi ze souboru x.txt znaky 12 až konec a ulož ho tak, nebo tak něco bylo v historických jazycích... :-)

První řádek v logu je vždy stejný...
Název: Re:Prosím o pomoc se skriptem
Přispěvatel: Kedrigern 23 Prosince 2011, 11:28:31
No to by ten sed uměl také. Problém je, že sed je streamový (proudový) editor a neumí rovnu vzít soubor a upravit ho. Vždy mu musíš dát vstupní a výstupní soubor.

Což mi připomnělo jak je to správněji:
Kód: [Vybrat]
#!/bin/bash

for i in *.log ; do                     # cyklus, projde vsechny soubory s priponou log
  ed "$i" <<<'1d
w'
done;
Název: Re:Prosím o pomoc se skriptem
Přispěvatel: starenka 23 Prosince 2011, 11:40:50
man head
man tail

;)
Název: Re:Prosím o pomoc se skriptem
Přispěvatel: GdH 23 Prosince 2011, 14:08:40
No to by ten sed uměl také. Problém je, že sed je streamový (proudový) editor a neumí rovnu vzít soubor a upravit ho. Vždy mu musíš dát vstupní a výstupní soubor.

Což mi připomnělo jak je to správněji:

Ale umí, viz přepínač -i ;)
Název: Re:Prosím o pomoc se skriptem
Přispěvatel: Kedrigern 24 Prosince 2011, 15:17:12
No to by ten sed uměl také. Problém je, že sed je streamový (proudový) editor a neumí rovnu vzít soubor a upravit ho. Vždy mu musíš dát vstupní a výstupní soubor.

Což mi připomnělo jak je to správněji:

Ale umí, viz přepínač -i ;)

IMHO:
1) GNU extensions
2) V reálu to bude procovat tak, že to vytvoří dočasný soubor a tamten pak nahradí. Ed by to měl opravdu jen editnout (což by mohlo být znát u nějakých gigantických logů).
Což je v tomto případě samozřejmě jedno. Ale obecně je lepší snažit se šetřit zdroji vždy.
Název: Re:Prosím o pomoc se skriptem
Přispěvatel: 1x23 29 Prosince 2011, 12:14:15
ahoj potreboval bych vypsat stav raid pole, ale skoncil jsem na tom, ze mi u awk nebere $4 a bere to jako promennou. jak by to slo obejit?

#!/bin/bash

RAIDHODNOTA="cat /proc/mdstat | grep blocks | awk '{ print $4 }'"

        echo $RAIDHODNOTA


exit 0

Dekuji
Název: Re:Prosím o pomoc se skriptem
Přispěvatel: pacholik 29 Prosince 2011, 13:10:45
když ty uvozovky vyměníš za protičárky (jak to asi chceš mít) tak ti to fungovat bude
Kód: [Vybrat]
RAIDHODNOTA=`cat /proc/mdstat | grep blocks | awk '{ print $4 }'`
taky nemusíš používat awk, na takhle jednoduché věci stačí cut
Kód: [Vybrat]
RAIDHODNOTA=`cat /proc/mdstat | grep blocks | cut -d" " -f4`
Název: Re:Prosím o pomoc se skriptem
Přispěvatel: 1x23 29 Prosince 2011, 16:34:53
super, dekuji:)