Portál AbcLinuxu, 12. května 2025 05:27
Řešení dotazu:
Dobrá rada: jestli chceš pomoct, musíš:
Tvůj popis problému je naprosto nicneříkající. Věšteckou kouli máme všichni v opravě.
awk | sed | sed | grep | awk | sed
určitě půjde sloučit do jednoho awk
).
Dobrá tedy pomohl by mi to někdo zoptimalizovat prosím, a vyřešit tu chybu proč mi to nefilturuje výstup z toho souboru.
strace -f 2>&1 ./pokus.sh > /dev/null |
awk '/<unfinished ...>$/ {pole[$1$2]=$0; next}/<... .* resumed>/ {if($1$2 in pole) print pole[$1$2] $0; delete pole[$1$2]; next}{ print $0 }' |
sed 's/^\(.*\) <unfinished .* resumed> \(.*\)/\1\2/' |
sed 's/^[pid [0-9]*] \(.*\)/\1/' |
grep '^execve(' |
awk '{ if($4 >= 0 ) print $1}' |
sed 's/^.*"\([^"]*\)".*/\1/' | sort | uniq
Tento kod normalně filtruje, problém je však v tom když to strace přesměruji do souboru:
strace -f -o soubor 2>&1 ./pokus.sh > /dev/null
a chci vyfiltrovat soubor tak nastane problém. Několikrát jsem upravoval sed i awk, ale pořád se mi to nedaří. Díky za odpovědi
<pre>
, ať to jde číst...
strace -f 2>&1 ./pokus.sh > /dev/null |
awk '/<unfinished ...>$/ {pole[$1$2]=$0; next}/<... .* resumed>/ {if($1$2 in pole) print pole[$1$2] $0; delete pole[$1$2]; next}{ print $0 }' |
sed 's/^\(.*\) <unfinished .* resumed> \(.*\)/\1\2/' |
sed 's/^[pid [0-9]*] \(.*\)/\1/' |
grep '^execve(' |awk '{ if($4 >= 0 ) print $1}' | sed 's/^.*"\([^"]*\)".*/\1/' | sort | uni
execve("./xxx", ["./xxx"], [/* 55 vars */]) = 0
...
[pid 29787] execve("/bin/ls", ["ls"], [/* 54 vars */] <unfinished ...>
Pomoci paremetru -o:
29725 execve("./xxx", ["./xxx"], [/* 55 vars */]) = 0
...
29726 execve("/bin/ls", ["ls"], [/* 54 vars */]) = 0
Nejjistejsi cesta je prevest ten soubor na puvodni format, coz by se dalo udelat napriklad pridanim na zacatek tohohle vyrazu:
sed 's/\([0-9]\+\) /[pid \1] /'
Lepsi cesta je to nejak zoptimalizovat, ale to je na delsi dobu premysleni co tim autor myslel -o
použít klasické přesměrování shellem? Pak by ten formát měl být stejný.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.