0

我有一个包含页眉和页脚的文件,并且数据经过多次迭代(带有页眉和页脚),我想分隔数据并且不想要页眉页脚。我的目标是进行数据处理以进行性能分析,它只是解析部分并不顺利。

文件中的数据:

   09:31:56 12/13/11 r/w I/O per second KBytes per sec  Svt ms     IOSz KB     
              VVname      Cur  Avg  Max  Cur  Avg  Max Cur Avg   Cur   Avg Qlen
               admin   r    0    0    0    0    0    0 0.0 0.0   0.0   0.0    -
               admin   w   17   17   17   68   68   68 0.2 0.2   4.1   4.1    -
               admin   t   17   17   17   68   68   68 0.2 0.2   4.1   4.1    0
 z0001_app0136_s.254   r    0    0    0    0    0    0 0.0 0.0   0.0   0.0    -
 z0001_app0136_s.254   w    0    0    0    0    0    0 0.0 0.0   0.0   0.0    -
 z0001_app0136_s.254   t    0    0    0    0    0    0 0.0 0.0   0.0   0.0    0
....................
....................

-----------------------------------------------------------------------------------
  Footer            394   r   87   87      4354 4354      2.7 2.7  49.9  49.9    -
  Footer            394   w  126  126       906  906      0.1 0.1   7.2   7.2    -
  Footer            394   t  213  213      5260 5260      1.2 1.2  24.7  24.7    0
   09:32:57 12/13/11 r/w I/O per second KBytes per sec    Svt ms     IOSz KB     
              VVname      Cur  Avg  Max  Cur  Avg  Max  Cur  Avg   Cur   Avg Qlen
               admin   r    0    0    0    0    0    0  0.0  0.0   0.0   0.0    -
               admin   w   32   24   32  130   99  130  0.2  0.2   4.1   4.1    -
               admin   t   32   24   32  130   99  130  0.2  0.2   4.1   4.1    0
 z0001_app0136_s.254   r    0    0    0    0    0    0  0.0  0.0   0.0   0.0    -
 z0001_app0136_s.254   w    0    0    0    0    0    0  0.0  0.0   0.0   0.0    -

文件中的数据一遍又一遍。

4

3 回答 3

0

您应该真正格式化您的输入以包含足够数量的样本数据。此外,您应该添加一些预期的输出来显示您要完成的工作。您可能还想考虑阅读和回复您问题下的评论。

也就是说,这行GNU awk,可以帮助您:

awk '$1 !~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/ && $1 != "VVname" && $1 != "Footer"' file.txt
于 2012-09-21T12:18:30.297 回答
0

这是我对这个问题的看法:

#!/bin/bash
#
# file: 12523967.sh
# Needs at least bash version 3.x

: ${DEBUG:=0}
: ${LOGFILE:="./12523967-data.log"}

TOKENS="VVname Flag Cur_IO_s Avg_IO_s Max_IO_s Cur_KB_s Avg_KB_s Max_KB_s Cur_Svt_ms Avg_Svt_ms Cur_IOSz_KB Avg_IOSz_KB Qlen"
DREGEX="^[[:digit:]]{2}:.*$"

while IFS=, read $TOKENS; do
    ## Skip entry if empty, or contains 'Footer' or 'Timestamp' or 'VVname'
    if [[ -z $VVname || $VVname =~ $DREGEX || $VVname =~ VVname || $VVname =~ Footer ]]; then
        continue
    fi
    [[ $DEBUG -eq 1 ]] && printf "%s %s %s %s %s %s\n" \
                "$VVname $Flag" \
                "$Cur_IO_s $Avg_IO_s $Max_IO_s" \
                "$Cur_KB_s $Avg_KB_s $Max_KB_s" \
                "$Cur_Svt_ms $Avg_Svt_ms" \
                "$Cur_IOSz_KB $Avg_IOSz_KB" \
                "$Qlen"

    # [...] Do whatever you have to do with the named entries

done < <(sed -e 's/^ *//g;s/  */,/g;s/^[\.-]*//g;' $LOGFILE)

使用您的示例(包括 '...' 和 '---' 行,因为我不太确定它们是否构成您的日志文件输出的一部分),调用DEBUG=1通过其字段名称打印出解析的行:

$ DEBUG=1 ./12523967-parse.sh 
    admin r 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    admin w 17 17 17 68 68 68 0.2 0.2 4.1 4.1  -
    admin t 17 17 17 68 68 68 0.2 0.2 4.1 4.1  0
    z0001_app0136_s.254 r 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    z0001_app0136_s.254 w 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    z0001_app0136_s.254 t 0 0 0 0 0 0 0.0 0.0 0.0 0.0  0
    admin r 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    admin w 32 24 32 130 99 130 0.2 0.2 4.1 4.1  -
    admin t 32 24 32 130 99 130 0.2 0.2 4.1 4.1  0
    z0001_app0136_s.254 r 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
    z0001_app0136_s.254 w 0 0 0 0 0 0 0.0 0.0 0.0 0.0  -
于 2012-10-31T21:44:45.570 回答
0

清理此类数据的常用方法是使用 grep,选择您想要的数据或排除您不想要的数据。在这种情况下,看起来所有需要的行都有一个字母(r、t 或 w),每边都有一个空格,而不需要的行都没有。(编辑:稍后将页脚行添加到问题中,因此grep -v添加了命令以排除页脚。)

如果数据在文件 d 中,你会说:

grep ' [rtw] ' d | grep -v Footer

这将选择数据行,但不会选择页眉、页脚或空白行。要使用数据创建一个名为 t 的文件,请说:

grep ' [rtw] ' d | grep -v Footer > t

如果实际数据(与出现问题的数据相比)使用制表符或空格而不是空格,则使用'[[:space:]][rtw][[:space:]]'作为搜索字符串而不是' [rtw] '. 此外,不使用 -i 时,grep 区分大小写。如果要排除的术语以两种方式出现(有时为大写,有时为小写),请使用grep 选项-iv而不是:-v

grep '[[:space:]][rtw][[:space:]]' d  | grep -iv footer > t
于 2012-09-21T04:01:29.193 回答