Hirdetés

2021. október 21., csütörtök

Gyorskeresés

Hozzászólások

(#2651) Fecogame válasza bambano (#2650) üzenetére


Fecogame
veterán
LOGOUT blog

Végü megoldottam összehasonlítással, csak floating numbert nem olyan egyszerű bash alatt :)

NULLASERTEK="0.000000"
NAGYOBBERTEK="0.534545"
[ $(bc <<< "$NULLASERTEK <= $NAGYOBBERTEK") -eq 1 ] && echo "Nagyobb, mint 0"

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2652) dabadab válasza bambano (#2650) üzenetére


dabadab
titán
LOGOUT blog

De az csak egész számokra működik, bash nem tud tizedestörteket kezelni, szóval szerintem a regexillesztés lesz a megoldás.

DRM is theft

(#2653) Hege1234


Hege1234
őstag

Sziasztok!

programozás topikból küldtek ide hozzátok

bash-ba szeretném eljuttatni a .txt-be lévő sorokat a file és a resume rész után

save.sh
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '[{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["percentage"]],"id":17},{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]' | jq '.[].result.item.file, .[].result.percentage | select(. != null)' > save.txt
 
ez létrehozza a save.txt-t
smb://192.168.1.10/@.mkv
52.96696472167969

a load.sh betölti a videót az adott pozicióra ugorva

load.sh
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"smb://192.168.1.10/@.mkv"},"options":{"resume":52.96696472167969}}}'

ebbe kellene valahogy a "file": és a "resume": után beilleszteni a txt-be lévő sorokat

bambano: itt az a gond, hogy ha a --data aposztrófok között van (ezt én se figyeltem, hogy külön paraméter), akkor a ${változó} behelyettesítést a shell nem csinálja meg. ezért a --data-t idézőjelek közé kellene tenni, viszont akkor belül a json idézőjelei be fognak kavarni, azokat escape-lni kell.
valószínűleg ez már offtopic itt, van rá szaktopic.

köszi, előre is a segítséget!

[ Szerkesztve ]

(#2654) bambano válasza Fecogame (#2651) üzenetére


bambano
titán
LOGOUT blog

jogos, ez elkerülte a figyelmem. :R

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2655) Jester01 válasza Hege1234 (#2653) üzenetére


Jester01
veterán

Szerencse, hogy stringeket tetszőlegesen össze lehet fűzni.
echo 'foo${bar}'"${bar}"'baz'
Az elsőt nem bontja ki a másodikat igen.

Tehát a paraméter előtt szépen teszel egy idézőjelet majd bezárod az aposztrófot. Majd idézőjelbe beírod a változódat, majd visszanyitod az aposztrófot, beteszed a záró idézőjelet és minden mehet tovább.

Ha azt a 2 sort már betetted változókba mondjuk $url és $pos akkor

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"'"${url}"'"},"options":{"resume":'"${pos}"'}}}'

[ Szerkesztve ]

Jester

(#2656) Hege1234 válasza Jester01 (#2655) üzenetére


Hege1234
őstag

köszönöm szépen! :R

filenev=$(head -1 save.txt)
idopont=$(head -2 save.txt | tail -1)
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"'"${filenev}"'"},"options":{"resume":'"${idopont}"'}}}'

(#2657) Headless


Headless
őstag

sziasztok!

egy megoldást keresek egy bináris fájl szétválasztására egy bizonyos hex karakter sorozat elválasztásával több részre osztani, konkrétan egy cubemap kép sorozat ami jxr (képeket, posx,posy,posz,negx,negy,negz) fájlokat tartalmaz. ezeket szeretném szétválasztani. az elválasztó lehetne a wmphoto magic numbere \x4949BC. minden wm photo kép ezzel kezdődik.

mivel bináris fájl sed meg sorokat vizsgál az nem feltétlen megfelelő, egyáltalán van-e értelme bashal szenvedni, vagy ez már inkább egyszerűbb/gyorsabb egy rendes (nem script) nyelvel?

[ Szerkesztve ]

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2658) Hege1234


Hege1234
őstag

amikor így szerepelnek a sorok a .txt fájban
jq, awk vagy más hasonló megoldással, hogyan lehetne
a számokat úgy átalakítani, hogy a 2. sorba legyenek és a 10 alatti számok elé
mindig kerüljön egy 0?

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '[{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["time"]],"id":17},{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]' | jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' > "c:\kodi\info.txt"

[netes jq link]

eredeti:
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
2
3
5

elképzelt: (235)
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
020305

elképzelt 2.: (14325)
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
014325

jq és awk kombinációjával jutottam el idáig, hogy
ez lett belőle de nem sikerül rájönnöm, hogyan lehetne úgy megoldani ahogy elképzeltem

| jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' | awk '{key=$0; getline; print key "" $0;}'
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA2
35

| jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' | awk 'NR > 1 { printf("") } {printf "%s",$0}'
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA235

(#2659) Headless válasza Headless (#2657) üzenetére


Headless
őstag

megoldottam, mivel a fájlokban van egy másik separator, azt feltudtam hasnálni, nyilván a zárt forráskódű fejlesztők is azt használják szeparátornak...
Röviden: grep kikeresem a byteoffseteket a separatorokhoz, majd végig megyek rajtuk while ciklusban, kiszámolom a megfelelő kezdő/végoffset értékeket és azt dd-vel szépen átmásálom. A separatort átírom, hogy ne legyen kereshető, nehogy megtalálja a zárt forráskódú szoftver fejlesztő, vagy bárki más aki rákeresne :)

Az elején van 4 byte felesleg, valamint a separator 8 byte azt hozzáadom az előző byteoffsethez

previousByteOffset=4
imageCount=0
grep -oba ggggggg "$imageFile" |while IFS=: read byteOffset rest;do
    dd if="$imageFile" of="$imageFile-$imageCount.jpg" bs=$(($byteOffset-$previousByteOffset)) count=1 skip=$previousByteOffset iflag=skip_bytes
    previousByteOffset=$(($byteOffset+8))
    imageCount=$(($imageCount+1))
done

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2660) Jester01 válasza Hege1234 (#2658) üzenetére


Jester01
veterán

read line
echo "$line"
while read line
do
    printf "%02d" "$line"
done
echo

Jester

(#2661) Hege1234 válasza Jester01 (#2660) üzenetére


Hege1234
őstag

sajnos nem sikerült rájönnöm ezt hol kellene használnom, hogy beleírja az info.txt -be
a felugró ablakba a beírt számok 1-9 ig mindig kaptak nullát
a 014325, 020305 viszont nem sikerült beírnom
olyan mintha, mivel 10 nél nagyobb így a szám levenné róla a nullát vagy valamilyen műveletet is csinálna közbe

(#2662) Hege1234


Hege1234
őstag

segítséggel persze de meglett végül a megoldás

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '[{"jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["time"]],"id":17},{"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18}]' | jq --raw-output '.[0].result + .[1].result | .item.file, ( .time | .hours * 3600 + .minutes * 60 + .seconds | strftime("%H%M%S"))' > info.txt

demo

(#2663) Fecogame


Fecogame
veterán
LOGOUT blog

Van egy ilyen awk parancsom:

awk "BEGIN {print (($(awk "BEGIN {print (100 - 0.11)}") * 0.000025442)/100)}"

A kimenet pedig így néz ki:
2.5414e-05

Na most én ezt "normálisan" kiírva szeretném megkapni, nem pedig tudományos formátumban. Találtam ezt a megoldást, de beillesztve (print cserélve printf-re) nem működik, errort dob:

awk "BEGIN {printf "%.2f", (($(awk "BEGIN {printf "%.2f", (100 - 0.11)}") * 0.000025442)/100)}"

Error:
awk: line 1: syntax error at or near %

Hogyan kaphatnám meg az eredményt, ami 0.00002541401?

:R

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2664) vargalex válasza Fecogame (#2663) üzenetére


vargalex
félisten

Ha tudod a tizedes jegyek számát, akkor:

echo | awk '{printf "%.13f", (100-0.11)*0.000025442/100}'

vagy a awk BEGIN-ben echo nélkül:

awk 'BEGIN {printf "%.13f", (100-0.11)*0.000025442/100}'

Természetesen, ha csak az általad írt kerekített érték kell, akkor a formátum a "%.11f".
Nem értem, hogy miért használod a beágyazott AWK-t...
Egyébként az AWK programot sima aposztrófok közé szokás tenni, így nincs kavarodás a printf formátum leírójával.

[ Szerkesztve ]

Alex

(#2665) Fecogame válasza vargalex (#2664) üzenetére


Fecogame
veterán
LOGOUT blog

Sajnos nem tudom, hány tizedesjegy lesz benne.

Azért tettem macskakörmök közé, mert használok benne 2 változót is, csak most az egyszerűség kedvéért behelyettesítettem számokkal :)

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2666) Lenry


Lenry
nagyúr
LOGOUT blog

egy bash scriptem egy while ciklussal szalad végig egy mappán, és végzi el a feladatát.
lehet valahogy előre tudni, hogy hány elemen fog dolgozni?
ki szeretném íratni, hogy pl a 130-ból a 15. mappán dolgozik épp'. utóbbi nyilván nem gond. előbbire viszont nincs ötletem

[ Szerkesztve ]

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2667) Jester01 válasza Lenry (#2666) üzenetére


Jester01
veterán

Először kigyűjtöd a listát amin végig kell menni?

Jester

(#2668) Lenry válasza Jester01 (#2667) üzenetére


Lenry
nagyúr
LOGOUT blog

find . -mindepth 1 -maxdepth 1 -type d -name "*" -print | while ((i++)); read path
do
.....
done

ennyi az egész

[ Szerkesztve ]

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2669) Jester01 válasza Lenry (#2668) üzenetére


Jester01
veterán

dirs=(*/)
i=1
for path in "${dirs[@]}"
do
  echo $((i++))/${#dirs[@]} "$path"
done

Jester

(#2670) Headless válasza Lenry (#2668) üzenetére


Headless
őstag

Szia

ehhez hasonló megoldás lehet

dir_list=$(find . -mindepth 1 -maxdepth 1 -type d -name "*" -print)
dir_count=$(echo "$dir_list" |wc -l)
echo "$dir_list" |while ((i++)); read path
do
.....
done

Én csak másoltam a te funkcióidat azt nem vizsgáltam, hogy megfelelő-e, vagy, hogy van-e egyszerűbb, mellesleg szerintem van kicsit fura a while ciklusod, nem is tudom hogy ez szintaktikailag helyes-e.

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2671) Lenry válasza Headless (#2670) üzenetére


Lenry
nagyúr
LOGOUT blog

hibátlanul fut, szóval olyan nagyon nem lehet elb*szva.

köszi a válaszokat :R

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2672) JoinR válasza Lenry (#2668) üzenetére


JoinR
senior tag

Legkevesebb módosítással:

LEN=$(ls -l | grep -c ^d)
find . -mindepth 1 -maxdepth 1 -type d -name "*" -print | while ((i++)); read path
do
echo $i/$LEN
done

(#2673) Lenry válasza JoinR (#2672) üzenetére


Lenry
nagyúr
LOGOUT blog

bakker, ez annyira egyszerű, nem tudom hogy nem jutott eszembe :W
köszi :R

[ Szerkesztve ]

Gvella Glan! | There are two types of people: Those who can extrapolate from incomplete data

(#2674) bambano válasza JoinR (#2672) üzenetére


bambano
titán
LOGOUT blog

miért nézed két módszerrel a listát?

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#2675) Fecogame


Fecogame
veterán
LOGOUT blog

ksh-ban szeretnék tört számokkal dolgozni, lehetőleg külső parancs nélkül. Az oka, hogy több tízezerszer kell lefuttatnom, és számít, mennyi idő alatt végez. awk-val már megcsináltam, csak lassú.

A furcsa az, hogy itt kiírja rendesen az eredményt tört számként:
pi@raspberrypi:~ $ ksh -c 'echo $((250/0.8))'
312.5

Itt viszont nem:
pi@raspberrypi:~ $ ksh -c 'echo $((24832/23413))'
1

És így sem:
pi@raspberrypi:~ $ ksh -c 'echo $((23413/24832))'
0

Miért? És hogyan lehetne rávenni, hogy ne kerekítsen? :)

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2676) dabadab válasza Fecogame (#2675) üzenetére


dabadab
titán
LOGOUT blog

ksh-ban szeretnék tört számokkal dolgozni

Igen, ezt hívják statisztikusnak.

:DDD

Egyébként meg pont úgy működik, mint C-ben: ha sima egész számokat adsz meg, akkor integer aritmetikát használ, ha lát benne tizedespont (vagy vesszőt, éljen a lokalizáció :D ), akkor meg floating pointot:

db@jano:~$ ksh -c 'echo $((24832/23413.0))'
1.06060735488830991

(Ja, és nincs floating point minden ksh-ban, verziótól függ)

[ Szerkesztve ]

DRM is theft

(#2677) Fecogame válasza dabadab (#2676) üzenetére


Fecogame
veterán
LOGOUT blog

Köszi, így már működik! :) :R

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#2678) Headless válasza Fecogame (#2675) üzenetére


Headless
őstag

ha nagyon érdekel a teljesítmény shellt miért nem felejted el? pl megcsinálhatod az egészet awk-val. Még lehet egy python is gyorsabb. vagy ha tényleg számít minden us akkor c++.

annó csináltam egy tesztet:
1-1000-ig vizsgáltam a számokat, hogy prím-e és a tisztán awk megoldás töredéke volt, mint a sima shell megoldásnak.

[ Szerkesztve ]

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2679) coco2


coco2
senior tag

Sziasztok!

Linux / bash script. Kicsit (nagyon) kijöttem a gyakorlatból.

Van egy környezeti változó, T_STR. Benne van mondjuk ez: "custom str". Környezetből használom shell scriptben (/bin/bash enyem_script.sh) valahogy így:

#!/bin/bash
echo "${T_STR}"
echo "$T_STR"
echo ${T_STR}
echo $T_STR

Valaki le tudja írni nekem legalább dióhéjban, hogy mi a különbség ezek között az echo-k között? Ami különbség van, az mikor számít?

A ""-ről talán az volt, hogy ha space van a stringben, és nem raktam macskakörmök közé a változó értékét olyankor, amikor egy shell parancsba beillesztettem, akkor az két külön paraméternek minősülhet, és "szét törhet" miatta a parancs bemenetem. De erre visszaigazolást várnék tényleg ez van-e vele, vagy rosszl emlékszem?

A { }-ről valami változó érték értelmezés volt talán, de már nem emlékszem.

កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។

(#2680) Jester01 válasza coco2 (#2679) üzenetére


Jester01
veterán

Igen az idézőjel azért van. A kapcsoszárójel meg többek között akkor kell ha nem egyértelmű a változó neve, pl. echo "${T_STR}foo".

[ Szerkesztve ]

Jester

(#2681) coco2 válasza Jester01 (#2680) üzenetére


coco2
senior tag

Megvan, köszönöm :)

Nyersanyag tippet had kérjek script gyártáshoz.

Bash scriptben listázni szeretném a helyi könyvtárat ( ./ ), és ha találok file-t adott kiterjesztéssel (pld ".txt" -> létezik "file.txt"), első (vagy akár utolsó) olyan létező file nevét szeretném változóba rakni (FILENAME="file.txt"). A határozatlanság oka, hogy a mappában garantáltan csak egy olyan file lesz, de ha mégis több lenne, azt valahogyan detektálni kell, és leállítanom a scriptet, vagy hibatűrés jelleggel csak az egyiket dolgozni fel a sok közül. Bármelyik jó.

Ha jól sejtem, valami áradat szerkesztővel kell majd játszadoznom. Jól jönne rá pár példa, hogyan, és hogy az áradatszerkesztő scriptjéből hogyan mozgathatok adatot kívülre, ha egyáltalán bárhogyan.

កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។

(#2682) JoinR válasza coco2 (#2681) üzenetére


JoinR
senior tag

Kár túlbonyolítani, ha talál még fájlt, az utolsó lesz a változó értéke és kész.

(#2683) Headless válasza coco2 (#2681) üzenetére


Headless
őstag

utolsó elem
filename=$(ls ./*.txt |tail -n 1)

első elem
filename=$(ls ./*.txt |head -n 1)

LEDE - R3G/DIR860l -> https://tinyurl.hu/Ntkb/

(#2684) coco2 válasza Headless (#2683) üzenetére


coco2
senior tag

:C Köszönöm

កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។

Copyright © 2000-2021 PROHARDVER Informatikai Kft.