2016-06-21 7 views
0

folgende Ausgabe von "cat/proc/Softirqs":Shell-Skript zu schneiden/proc/Softirqs

    CPU0  CPU1  CPU2  CPU3 
      HI:   24   13   7   54 
     TIMER: 344095632 253285150 121234786 108207697 
     NET_TX: 2366955  319  695  316044 
     NET_RX: 16337920 16030558 250497436 117201444 
     BLOCK:  19631  2747  2353 5067051 
BLOCK_IOPOLL:   0   0   0   0 
    TASKLET:  298   93  157  20965 
     SCHED: 74354472 28133393 30646119 26217748 
    HRTIMER: 4123645358 2409060621 2466360502 401470590 
     RCU: 26083738 17708780 15330534 16857905 

Meine anderen Maschine verfügt über 24 CPU-Kern und der Ausgang ist schwer zu lesen, Ich mag die Ausgabe, um nur cpu0, cpu2, cpu4, cpu6, ... zu sein. Ich weiß, Schnitt oder awk könnte ued sein, um das zu tun, aber keine Idee, wie man es benutzt, um sogar Ausgabespalten zu erhalten.

Edit:

awk -F" " '{printf("%10s\t%s\n", $2,$4) }' 

erhalten

 CPU1 CPU3 
     24 7 
344095632 121234786 
    2366955 695 
    16337920 250497436 
    19631 2353 
     0 0 
     298 157 
    74354472 30646119 
4123645358 2466360502 
    26083738 15330534 

leider sollte CPU1 CPU0 sein, CPU3 sollte CPU2, die erste Zeile hat nur 4 Spalten sein, kann ich die erste Zeile überspringen in dieser Schale?

Edit2:

watch -d "cat /proc/softirqs | awk -F" " '{printf("%10s\t%s\n",$2,$4)}' " 

Begegnung Fehler wie folgt aus:

Every 2.0s: cat /proc/softirqs | awk -F '{print }' Tue Jun 21 10:23:22 2016 

Usage: awk [POSIX or GNU style options] -f progfile [--] file ... 
Usage: awk [POSIX or GNU style options] [--] 'program' file ... 
POSIX options:   GNU long options: (standard) 
     -f progfile    --file=progfile 
     -F fs     --field-separator=fs 
     -v var=val    --assign=var=val 
Short options:   GNU long options: (extensions) 
     -b      --characters-as-bytes 
     -c      --traditional 
     -C      --copyright 
     -d[file]    --dump-variables[=file] 
     -e 'program-text' --source='program-text' 
     -E file     --exec=file 
     -g      --gen-pot 
     -h      --help 
     -L [fatal]    --lint[=fatal] 
     -n      --non-decimal-data 
     -N      --use-lc-numeric 
     -O      --optimize 
     -p[file]    --profile[=file] 
     -P      --posix 
     -r      --re-interval 
     -S      --sandbox 
     -t      --lint-old 
     -V      --version 

To report bugs, see node `Bugs' in `gawk.info', which is 
section `Reporting Problems and Bugs' in the printed version. 

gawk is a pattern scanning and processing language. 
By default it reads standard input and writes standard output. 

Examples: 
     gawk '{ sum += $1 }; END { print sum }' file 
     gawk -F: '{ print $1 }' /etc/passwd 

was sonst sollte ich versuchen?

Edit3:

Die endgültige bearbeitbar Schale möchte:

# define function encapsulating code; this prevents any need for extra layers of quoting 
# or escaping. 
run() { 
    awk 'NR>1{printf("%20s\t%10s\t%s\n",$1,$2,$4)}' </proc/softirqs|egrep 'TIMER|RX' 
} 

# export function 
export -f run 

# run function in subshell of watch, ensuring that that shell is bash 
# (other shells may not honor exported functions) 
watch -d "bash -c run" 
+0

Wenn Sie eine Reihe von Shell-Code entkommen wollen sie passieren zu 'watch',' printf % q' ist dein Freund - oder leg es einfach in ein Skript; 'watch' - das bei jedem Refresh einen neuen' sh -c'-Lauf ausführt - ist ausreichend ineffizient, um durch einen zusätzlichen Shell-Aufruf nicht viel zu verlieren. –

+1

Das heißt, die Frage zu stellen, wie man den Dingen aus dem Weg gehen kann, sollte eine eigene Frage sein, anstatt in diese zu münden; Wahrscheinlich haben Sie die Frage gestellt, da sie zu weit gefasst ist, um sie in die Site-Regeln einzupassen, da sie nun zwei völlig unterschiedliche Fragen enthält und eine Antwort beide umfassen müsste, um vollständig reagieren zu können. –

+0

...oder, wenn Sie Code haben, den Sie mögen und einfach wissen wollen, wie man ihn von 'watch' ausführt, ist das auch akzeptabel; es versucht, sowohl den Formatierungscode zu bekommen, als auch ihn von "watch" in einer übertriebenen Frage auszuführen. –

Antwort

2

Eine einfache Möglichkeit, Code zu einem subProzess von watch zu kommunizieren, die Fehler vermeidet, zu entkommen ist eine exportierte Funktion zu verwenden:

# define function encapsulating code; this prevents any need for extra layers of quoting 
# or escaping. 
run() { 
    awk -F" " '{printf("%10s\t%s\n",$2,$4)}' </proc/softirqs 
} 

# export function 
export -f run 

# run function in subshell of watch, ensuring that that shell is bash 
# (other shells may not honor exported functions) 
watch "bash -c run" 

Um die Abhängigkeit von exportierten Funktionen zu vermeiden, man kann declare -f auch die Funktion der Quelle in einer eval Lage Form abzurufen, verwenden und printf %q es zu entkommen Verarbeitung durch die äußere Hülle von watch aufgerufen, um zu überleben:

run() { 
    awk -F" " '{printf("%10s\t%s\n",$2,$4)}' </proc/softirqs 
} 
printf -v run_str '%q' "$(declare -f run); run" 
watch "bash -c $run_str" 
0

die erste Zeile zu überspringen, zu tun:

awk -F" " 'NR>1{printf("%10s\t%s\n", $2,$4) }' 

Warum brauchen Sie -F" ", ist ein Geheimnis für mich. Sie können auch schreiben:

awk 'NR>1{printf("%10s\t%s\n", $2,$4) }' 

(. Was den watch Teil, Andere Antwort/s)

+0

Tatsächlich funktioniert es nicht. Das Uhrenteil wurde entfernt. Ohne Uhr funktioniert es. – user31264

+0

Yup. Das ist der Grund, warum ich immer noch daran festhalte, wie man das formatiert, und wie man es in 'watch' arbeiten lässt, sollten zwei völlig getrennte Fragen sein. –