>我有一个日志文件,我需要将其解析为多个文件。
############################################################################################6610############################################################################################GTI02152 I gtirreqi 20130906 000034 TC SJ014825 GTT_E_REQ_INF テーブル挿入件数 16件############################################################################################Z5000############################################################################################GTP10000 I NIPS gtgZ5000 20130906 000054 TC SJ014825 シェル開始############################################################################################
我需要创建像 6610 这样的文件.txt它的所有值分别在 6610 like(GTI02152..) 和 z5000(GTP10000) 下。任何帮助将不胜感激!
下面的脚本将帮助您获取信息。您可以修改它们以创建所需的数据。
#!/bin/sh
cmd=`cat data.dat | paste -d, - - - - - | cut -d ',' -f 2,4 > file.out`
$cmd
while read p; do
fileName=`echo $p | cut -d ',' -f 1`
echo $fileName
dataInfo=`echo $p | cut -d ',' -f 2`
echo $dataInfo
done< file.out
这是一个尴尬风格的答案:
我将以下内容放入名为 awko
的文件中,并chmod +x
它以使用它:
#!/usr/bin/awk -f
BEGIN { p = 0 } # look for filename flag - start at zero
/^#/ { p = !p } # turn it on to find the filename
# either make a filename or write to the last filename based on the flag
$0 !~ /^#/ {
if( p == 1 ) filename = $1 ".txt"
else print $0 > filename
}
运行awko data.txt
生成了两个文件,即示例数据中的6610.txt
和Z5000.txt
。 它还能够向输出文件发送更多数据线。
你也可以
用Ruby来做到这一点:
ruby -e 'File.read(ARGV.shift).scan(/^[^#].*?(?=^[#])/m).each{|e| name = e.split[0]; File.write("#{name}.txt", e)}' file
示例输出:
> for A in *.txt; do echo "---- $A ----"; cat "$A"; done
---- 6610.txt ----
6610
---- GTI02152.txt ----
GTI02152 I gtirreqi 20130906 000034 TC SJ014825 GTT_E_REQ_INF テーブル挿入件数 16件
---- GTP10000.txt ----
GTP10000 I NIPS gtgZ5000 20130906 000054 TC SJ014825 シェル開始
---- Z5000.txt ----
Z5000
此脚本做出以下假设:
- 每条记录由空行分隔 ##
- ## 行纯粹是注释/空格填充,在解析过程中可以忽略
- 每条记录的第一行(忽略 ####)包含文件名的基本名称
日志文件的名称作为第一个参数传递给此脚本。
#!/bin/bash
# write records to this temporary file, rename later
tempfile=$(mktemp)
while read line; do
if [[ $line == "" ]] ; then
# line is empty - separator - save existing record and start a new one
mv $tempfile $filename
filename=""
tempfile=$(mktemp)
else
# output non-empty line to record file
echo $line >> $tempfile
if [[ $filename == "" ]] ; then
# we haven't yet figured out the filename for this record
if [[ $line =~ ^#+$ ]] ; then
# ignore #### comment lines
:
else
# 1st non-comment line in record is filename
filename=${line}.txt
fi
fi
fi
done < $1
# end of input file might not have explicit empty line separator -
# make sure last record file is moved correctly
if [[ -e $tempfile ]] ; then
mv $tempfile $filename
fi