0

该函数必须检查是否TARGET为空,如果它为空,我希望它重复,但这次c1TIME=$hours:$minutes:[0-9][0-9] 运行它,如果它仍然是空的,那么c1TIME=$hours:$c1minutes[0-9]:[0-9][0-9] 它应该停止并回显一些信息。

$1是带有错误的标准日志文件

$TIME在这种模式下随着时间的推移字符串HH:MM:SS 如果这令人困惑,我很抱歉,我很感激任何帮助

这个函数的详细作用:
首先它需要一个随机时间,12:34:56在 c1 秒内只读取“5”,然后c1TIME12:34:5[0-9]
Target 现在尝试在日志文件中找到 c1TIME 字符串所在的行并打印线。例如,在找到的时间
c1DATE更改。 其余的其实并不重要 12:34:5[0-9]12:34:56

就像我上面说的,当TARGET它为空时它必须再次运行,那么我如何在函数执行时或之后检查 TARGET 呢?

  function check() {     
    c1seconds=`echo $TIME | awk '{print substr ($1,7,8)}' | head -1c`
    c1TIME=$hours:$minutes:$c1seconds[0-9]
    TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`
    c1DATE=`cat $1 | grep "$c1TIME" | grep -Eo "[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}" | head -1`
    EXCEPTION=`tail -$[$WINDOW_LINES-$TARGET] $1 | grep -c Exception`
    ERROR=`tail -$[$WINDOW_LINES-$TARGET] $1 | grep -c Error`
    SEMAPHORE=`tail -$[$WINDOW_LINES-$TARGET]  $1| grep -c semaphore`
    echo $TARGET
    return 0
  }
4

2 回答 2

1

你想重复while的目标是空的::) 所以你去:

function check() {

    c1seconds=`echo $TIME | awk '{print substr ($1,7,8)}' | head -1c`
    c1TIME=$hours:$minutes:$c1seconds[0-9]
    TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`

    if [ x$TARGET = x ] ; then
           c1TIME=$hours:$minutes:[0-9][0-9] 
           TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`
    fi

    c1DATE=`cat $1 | grep "$c1TIME" | grep -Eo "[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}" | head -1`
    EXCEPTION=`tail -$[$WINDOW_LINES-$TARGET] $1 | grep -c Exception`
    ERROR=`tail -$[$WINDOW_LINES-$TARGET] $1 | grep -c Error`
    SEMAPHORE=`tail -$[$WINDOW_LINES-$TARGET]  $1| grep -c semaphore`
    echo $TARGET

}

顺便说一句,做你正在做的事情是一种丑陋的方式:P

感觉更丑 :) 但我不知道您要完成什么或您的输入是什么,所以答案如上所示。

于 2013-05-15T10:07:03.830 回答
0

那么你总是可以使用递归。将 a 保持level=0在全局级别并再次调用该函数。

level=0;
function check() {

现在代替

c1TIME=$hours:$minutes:$c1seconds[0-9]

利用

if [ $level -eq 0 ]; then c1TIME=$hours:$minutes:$c1seconds[0-9]; fi
if [ $level -eq 1 ]; then c1TIME=$hours:$minutes:[0-9][0-9]; fi
if [ $level -eq 2 ]; then c1TIME=$hours:$c1minutes[0-9]:[0-9][0-9]; fi
if [ $level -ge 2 ]; then echo "ERROR"; exit; fi

现在代替

TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`

利用

TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`
if [ "x$TARGET" = "x" ]; then ((level++)); check $@; fi

我没有运行它,所以可能存在拼写错误,但主要思想是递归次数和检查最多为 3,使用简单的 if 检查递归深度。您可以将系列修改ifif else。此外,如果grep可以打开一个文件,为什么cat file并管道它,如果awk可以在文件中搜索模式,为什么cat file | grep pattern在它之前?

于 2013-05-15T10:47:14.243 回答