Sziasztok.
Kérnék egy kis segítséget.
Van egy xyz parancsom, pl:
smartctl -A -d marvell /dev/sda | grep Temperature_Celsius | awk '{print $10}'
Ennek a kimenete egy hex érték:
0x26
Hogyan lehet ezt átalakítani decimálisra?
2 féle lehetőséget találtam eddig, ami működik:
echo $((0x15a))
Ekkor a 0x15a értékét kiírja decimálisan
vagy
printf '%d\n' 0x15a
De hogyan lehet a 0x15a helyére az előző parancssori kimenetet irányítani?
- 1962 megtekintés
Hozzászólások
A varázsszó a command substitution.
printf '%d\n' "$(smartctl stbstb)"
- A hozzászóláshoz be kell jelentkezni
$ printf '%d\n' "$(echo 10)"
Illegal variable name.
Ha már a hordozhatóságnál tartunk :P
(Ja, a shell tcsh)
- A hozzászóláshoz be kell jelentkezni
Nem is akartam kompatibilis lenni egy olyan shell-lel, ami nem ért POSIX-ül és nem lehet /bin/sh.
- A hozzászóláshoz be kell jelentkezni
Ha kompatibilitásra törekszünk, akkor nem $(parancs), hanem `parancs` formában kellene írni. Máris jó lenne a tcsh-dban is :-) Mondjuk a triviálisnál kicsit is komolyabb scriptet nehéz megírni úgy, hogy sh és csh is ugyanúgy hajtsa végre (más az értékadás / a feltételes utasítás / a ciklusszervező műveletek szintaxisa, stb.) Szóval vl-nek azzal a vacak perl-lel igaza van. Bár most fejből meg nem mondom, hogy van-e olyan eléggé triviális módosítás a perl4 és a perl5 (netán perl6) között, mint amilyen a python2 vs python3-ban mondjuk a print vs print().
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
Mondjuk a triviálisnál kicsit is komolyabb scriptet nehéz megírni úgy, hogy sh és csh is ugyanúgy hajtsa végre (más az értékadás / a feltételes utasítás / a ciklusszervező műveletek szintaxisa, stb.)
Szerintem lehetetlen, az eltérő szintaxis miatt mindenféleképpen.
Persze esetleg valami nagyon csúnya gányolással megoldható (pl. a shelltől függően létrehozni egy alias-t a feltételes utasításra/ciklusokra/stb., és ezeket a feltételesen létrehozott alias-okat használni). Sőt, (t)csh-ban még függvények sincsenek, arra is nagyon trükkösen lehet rábírni (legalábbis valami függvényhez hasonlító valamire).
Szóval vl-nek azzal a vacak perl-lel igaza van.
- A hozzászóláshoz be kell jelentkezni
Nekem 1995 óta a tcsh az interaktív shellem, szóval van némi tapasztalatom vele.
Ami egyszerű parancsok szimpla futtatásánál bonyolultabb script, azt nem lehet kompatibilisra megírni. Változó értékadásnál már bukta, if/for azonnal bukta, de már egy paraméter quote-olás is lehet bukta, mert nem pont ugyanazt a szabályt használják.
- A hozzászóláshoz be kell jelentkezni
Bár most fejből meg nem mondom, hogy van-e olyan eléggé triviális módosítás a perl4 és a perl5 (netán perl6) között
Nade perl4-et már senki nem használ. Olyannyira, hogy én >20 éve kezdtem perlezni, és már én sem használtam, talán 2-3 archaikus scripttel találkoztam még a 90-es években, ami 4-esre íródott. Szóval a perl4 szerintem nem releváns. A 6-osat még nem néztem meg közelről, ahhoz nem tudok hozzászólni.
- A hozzászóláshoz be kell jelentkezni
DOS alatt perl4-et futtattam, mert az volt, vagy a franc se tudja miért :-P
(És ha jól rémlik az AAA-t futtattam p2a segítségével, mert az MKS Toolkit féle AWK nem ette meg.)
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
Működik, köszi.
Úgy látom, azóta mások is írtak, kipróbálom majd azokat is. Még jó, hogy ennyi lehetőség van :)
- A hozzászóláshoz be kell jelentkezni
Ha már a parancsodban használod az awk
-t, miért nem azzal oldod meg?
...| awk '{printf "%d",$10}'
Sőt, akár a grep
funkcióját is kiválthatod:
smartctl -A -d marvell /dev/sda | awk '/Temperature_Celsius/ {printf "%d",$10}'
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
"a már a parancsodban használod az awk-t, miért nem azzal oldod meg?"
$ gawk 'BEGIN { printf "%d\n", 0x2a }'
42
$ mawk 'BEGIN { printf "%d\n", 0x2a }'
0
$ original-awk 'BEGIN { printf "%d\n", 0x2a }'
0
- A hozzászóláshoz be kell jelentkezni
De jó, hogy a különböző awk implementációk másként tudják ezt. :( Igaz, általában a sebesség és a komplexitás ellentmondó követelmények.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
$ gawk --posix 'BEGIN { printf "%d\n", 0x2a }'
0
$ gawk --traditional 'BEGIN { printf "%d\n", 0x2a }'
0
$ gawk --lint fatal 'BEGIN { printf "%d\n", 0x2a }'
gawk: cmd. line:1: fatal: numeric constant `0x2a' treated as hexadecimal
(és ugye amíg a One-True-AWK mást nem mond, addig az a "szabvány" ;-))
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
Ez se hosszabb, és ebből nincs 42 dialektus...
perl -e 'printf "%d\n", 0x2a;'
- A hozzászóláshoz be kell jelentkezni
"0x26".to_i(16)
echo "0x26" | ruby -e "puts STDIN.gets.to_i(16)"
=> 38
- A hozzászóláshoz be kell jelentkezni
A címből ("Linux CLI érték átadás") úgy vélem, hogy linuxon kell dolgozni...
- A hozzászóláshoz be kell jelentkezni
Linuxon futtattam mindhárom awk változatot.
- A hozzászóláshoz be kell jelentkezni
Linuxnál a sima awk parancs nem a gawk? Egyébként a FreeBSD-ben levő awk is "jól" működik*.
Nézegetem az awk szabványt, és valóban nem feltétlen kell bízni, hogy az awk úgy fog működni, ahogy akarjuk (legalábbis ha jól értem):
An integer constant cannot begin with 0x or include the hexadecimal digits 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', or 'F'.
* Szerk.: tévedtem, FreeBSD-n se megy úgy, ahogy írtad.
Úgy látszik, mazsi-nak van igaza, "bemeneten megeszi a hexát".
- A hozzászóláshoz be kell jelentkezni
ha a programban nem is, de a bemeneten azert megeszik a hexat (vagy ra lehet venni):
$ echo 0x2a | gawk --non-decimal-data '{ printf "%d\n", $1 }'
42
$ echo 0x2a | mawk '{ printf "%d\n", $1 }'
42
$ echo 0x2a | original-awk '{ printf "%d\n", $1 }'
42
az OP-nak most ez kell.
- A hozzászóláshoz be kell jelentkezni
Ezzel az a vicc, hogy a One-True-AWK és a mawk magától jól konvertálja, ha sztringként van megadva, ellenben a gawk-nak kell ez a hülye opció (vagy legalább a --posix kapcsoló) :
$ mawk 'BEGIN { printf "%d\n", "0x2a" }'
42
$ nawk 'BEGIN { printf "%d\n", "0x2a" }'
42
$ gawk 'BEGIN { printf "%d\n", "0x2a" }'
0
$ gawk --non-decimal-data 'BEGIN { printf "%d\n", "0x2a" }'
42
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
és az miért van hogy ha file-ból veszi a "parancsokat" akkor:
cat sima idez
BEGIN {printf "%d\n",0x2a}
BEGIN {printf "%d\n","0x2a"}
nawk -f sima
42
nawk -f idez
0
gawk -f sima
42
gawk -f idez
0
mawk -f sima
0
mawk -f idez
42
original-awk -f sima
0
original-awk -f idez
42
- A hozzászóláshoz be kell jelentkezni
Passz, de a gawk-ról eddig is az derült ki, hogy integer-konstansként elkezeli a C-szerű hexa-számokat; a nawk az tippem szerint gawk lesz - max esetleg --posix kapcsolóval.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
gawk -L=invalid 'BEGIN { printf "%d\n", '0x2a' }'
gawk: cmd. line:1: warning: numeric constant `0x2a' treated as hexadecimal
42
:-)
- A hozzászóláshoz be kell jelentkezni
$ gawk -L fatal 'BEGIN { printf "%d\n", '0x2a' }'
gawk: cmd. line:1: fatal: numeric constant `0x2a' treated as hexadecimal
$
Tud ez rosszabb is lenni ;-) (Speciel nekem -L=fatal esetén simán warningolt, de szóközzel az opciónál már azt teszi amit kellene. Amúgy a man gawk szerint is "-L invalid" vagy "--lint=invalid" a korrekt forma, a te verziód nem jó.)
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
igazad van az L-es kapcsoloval. azert kiserletezgettem mert szerintem
valahogy a parancssort dolgozzak fel mashogy a kulonbozo awk-k azert szamit
ennyire a single-double-no quote.
mindenestre szeretjuk az awk-t:
https://aadrake.com/command-line-tools-can-be-235x-faster-than-your-had…
- A hozzászóláshoz be kell jelentkezni
Beleolvasva a cikkbe, érdekesnek látszik. Ellenben a második felével a mondandódnak nem értek egyet. Az nyilvánvaló, hogy valahogy másképp dolgozzák fel az általunk megírt AWK-programot az egyes implementációk (hisz különböző programozók írták, ezért nagy eséllyel lesznek - ha más nem is -, apró eltérések). De azért itt valami másról van szó, mint hogy másként dolgozzák fel a parancssort. Főleg, mert azt nem ők dolgozzák fel. Ha valamit egy shell-parancssorban aposztrófok közé 'zárok', akkor azt a shell dolgozza fel, és technikailag feldolgozás nélkül az egész francot odaadja egy db. sztringben N. paraméterként annak a programnak, amit éppen meghívtunk. Ha az aposztrófok között van(nak) "idézőjel(ek)", az(oka)t is. Azaz fenti példákban az összes AWK implementáció megkap mindent, onnan hogy BEGIN, egészen a záró kapcsos zárójelig, mindezt az argv tömb 1-es indexű (amúgy második) elemeként.
Innentől pedig az AWK nyelv szintaxisa számít, ami baromira leegyszerűsítve úgy hangzik, hogy ami "idézőjelek" között van, az szövegkonstans. Ami nincs idézőjelek között, az pedig lehet speciális nyelvi elem (mint maga a BEGIN kulcsszó bizonyos helyeken; vagy pl a print parancs, netán a printf függvény), lehet egy általunk definiált függvény neve (tehát annak a fv-nek a hívása), lehet egy változó neve, és í. t. És lehet pl. konstans számérték. Csak épp anno a nyelv fejlesztői azt mondták, hogy csak decimális formában lehet numerikus konstansokat megadni, nem pedig binárisan/oktálisan/hexában. Azaz amikor "0x2a" szerepel, az mindenképpen szöveglánc. Ezzel szemben az idézőjelek nélküli 0x2a - no azt a fene tudja. Triviális ötlet lenne, hogy az egy eddig nem használt változó neve, és mivel a változók az első hivatkozásukkor jönnek létre 0 (vagy "") értékkel, akár még logikus is lenne a dolog és összhangban van a működéssel. Ellenben pl. a MAWK doksija explicit módon tartalmazza a kitételt, hogy a változók(meg függvények, tömbök) neve nem kezdődhet számmal, szóval ez az ötlet ugrott. Én személy szerint nem tudom megmondani, hogy akkor az ott mi, de én nem vagyok egy igazán profi AWK tudor, én csak a magam szintjén szeretem használni belőle azt a keveset, amit tudok.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
igazad van, hulyeseget irtam :-( a shell tudasom elhanyagolhato.
- A hozzászóláshoz be kell jelentkezni
$ awk 'BEGIN {printf "%d\n",0x11}'
0
$ awk 'BEGIN {printf "%d\n","0x11"}'
17
Idézőjellel több a második.
Szerk.: és akkor már le is esett, hogy a példád miért nem jó (a 0x...
idézőjel nélkül szám lenne, ami nem jó), és a bemenetről meg miért jó (stringként kezeli a $1
-et).
Számomra tanulságos volt :)
- A hozzászóláshoz be kell jelentkezni
Linux 2.6.31.8, AWK 4.0.0
Egyébként ez egy D-Link NSA325v2 NAS
- A hozzászóláshoz be kell jelentkezni