用于剪切/ proc / softirqs的Shell脚本

时间:2016-06-21 01:55:43

标签: shell awk cut

以下是“cat / 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

我的另一台机器有24个CPU内核,输出难以阅读, 我喜欢输出只有cpu0,cpu2,cpu4,cpu6,.... 我知道切割或awk可能会这样做, 但不知道如何使用它来获得均匀的输出列。

编辑:

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

将获得

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

不幸的是,CPU1应该是CPU0,CPU3应该是CPU2, 第一行只有4列,我可以跳过第一行 在这个shell?!

Edit2:

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

遇到如下错误:

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

我还应该尝试什么?!

Edit3:

最终可行的shell希望:

# 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"

2 个答案:

答案 0 :(得分:2)

将代码传递给watch的子进程以避免错误转义的一种简单方法是使用导出的函数:

# 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"

为了避免对导出函数的依赖,还可以使用declare -feval能够形式检索函数的源,并使用printf %q来逃避它以便在外部处理后继续存在由watch调用的shell:

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"

答案 1 :(得分:0)

要跳过第一行,请执行:

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

为什么你需要-F" ",对我来说是一个谜。你也可以写:

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

(至于watch部分,请参阅其他答案。)