![](/img/trans.png)
[英]How to Split a Delimited Text file in Linux, based on no of records, which has end-of-record separator in data fields
[英]want delimited data from file which has headers footers,for data crunching to do performance analysis
我有一個包含頁眉和頁腳的文件,並且數據經過多次迭代(帶有頁眉和頁腳),我想定界數據並且不希望頁眉頁腳。 我的目的是為了進行數據分析以進行性能分析,只是分析工作並不順利。
文件中的數據:
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 -
文件中的數據又一次又一次地遍歷。
清除此類數據的常用方法是使用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
您應該真正格式化輸入以包含足夠數量的樣本數據。 另外,您應該添加一些預期的輸出以顯示您要完成的工作。 您可能還想考慮閱讀並回答問題下的評論。
就是說,這行GNU awk
可以幫助您:
awk '$1 !~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/ && $1 != "VVname" && $1 != "Footer"' file.txt
這是我對這個問題的看法:
#!/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 -
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.