shell中如何分割文件?

现在有如下需求,求shell高手解答
想把类似于oracle alert日志抓取ORA-关键字,但是要显示整条比较全的记录(不止ORA-当前行,包括报错的时间点)。
有一种办法是以时间点(比如Wed Aug 02 22:26:21 2017,用正则表达式匹配),将文件分割成N跳记录,再用for循环匹配关键字ORA-,打印出来。linux下bashshell已经实现,AIX下可由会awk的高手指定一下?
alert.log举例:以下文本会被分割成3个文件,每个文件进包含一个时间点的日志记录
Wed Aug 02 22:26:21 2017
ARC3: Archival started
ARC0: STARTING ARCH PROCESSES COMPLETE
Starting background process CJQ0
Wed Aug 02 22:26:22 2017
CJQ0 started with pid=26, OS id=34118
Wed Aug 02 22:36:22 2017
Starting background process SMCO

linux下实现的命令,文本在每个时间点之前加空行,再以空行为分隔符将文本分割成N个小文件
sed -i '/.. ..:..:.. 20/i\\' alert..log
awk 'BEGIN{RS="\n\n"}{a++}{print > "tmpfile12345678_"a}' alert.log
for i in ls -l|grep tmpfile12345678_|awk '{print $9}'
do

ERR=`grep -E "ORA-|TNS-" $i`
if [ "$ERR" ];then
  cat $i
fi

done
rm -f ./tmpfile12345678_*

参与4

1同行回答

haizdlhaizdl  技术经理 , 大连
一个参考思路哈。按照行的方式读取文件(alert.log)对读到的每一行进行判断,如果是想要的日期时间格式,那么截取改行当中的前若干字符赋给一个固定变量。如果督导的不是日期时间格式,那么将改行内容输出到以变量为名称的文件当中。然后对小文件进行处理。cat $LOG | while read...显示全部

一个参考思路哈。

  1. 按照行的方式读取文件(alert.log)
  2. 对读到的每一行进行判断,如果是想要的日期时间格式,那么截取改行当中的前若干字符赋给一个固定变量。如果督导的不是日期时间格式,那么将改行内容输出到以变量为名称的文件当中。
  3. 然后对小文件进行处理。

cat $LOG | while read LINE
do

//取行中的判断字符串
//判断字符串是否为预期的特征字符串
    //如果是,那么将变量fileString= 赋值。
    //如果不是,>> $fileString.log

done

下面是一个类似次功能的例子,可以参考一下:

!/bin/bash

mkdir out
ls -l ./src_data/directorVIRTUAL_VOLUMES_PERPETUAL_MONITOR | awk '{print $9}' > src.lst
cat src.lst | while read FILE
do

    cat $FILE | while read LINE
    do
            fitKEY=`echo ${LINE:0:4}`
            if [ "$fitKEY" = "2017" ]; then
                    timestamp=$LINE
            elif [ "$fitKEY" = "devi" ]; then
                    vol=`echo $LINE | awk -F "," '{print $1}'`
                    echo $LINE","$timestamp >> ./out/$vol
            fi
    done

done

收起
银行 · 2017-08-16

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2017-08-15
  • 关注会员:2 人
  • 问题浏览:1864
  • 最近回答:2017-08-16
  • X社区推广