Grep移动空间?

时间:2015-07-24 22:45:22

标签: shell unix grep

{
while read -r  line ; do
   if grep -q '2015' $line
     then
      echo "inside then"
      echo "$line"
      echo "yes"
   fi
   done
} < testinput

执行上述代码后,输出为:

inside then
( nothing is printed in this line its spaces)  
yes

为什么输入线没有在第二个输出线上打印? 非常感谢您的帮助。我之所以要问的是,在使用grep匹配后,我实际上必须在输入行上执行一些操作。

输入文件示例:

2015-07-18-00.07.28.991321-240 I84033A497         LEVEL: Info
PID     : 21233902             TID  : 9510        PROC : db2sysc 0
INSTANCE: xxxxxxxx             NODE : 000         DB   : XXXXXXX
APPHDL  : 0-8                  APPID: *LOCAL.xxxxxxx.150718040727
AUTHID  : XXXXXXXX
EDUID   : 9510                 EDUNAME: db2agent (XXXXXXXX) 0
FUNCTION: DB2 Common, SQLHA APIs for DB2 HA Infrastructure

我需要捕获SQLHA在输入文件或日志文件中显示的时间。首先,我在输入文件中找到时间匹配,然后将时间保存在变量中。一旦找到SQLHA,我就会将保存在变量中的时间写入输出文件中。因此,对于日志中每次出现的SQLHA,我都会将时间写入输出文件。

3 个答案:

答案 0 :(得分:0)

这将执行您的脚本尝试执行的操作:

#!/usr/bin/awk -f
/2015/ {
  print "inside then"
  print
  print "yes"
}

答案 1 :(得分:0)

在更新了真正想要的内容后,相当清楚 您应该使用awk,但sed也可以选择(但更难)。你也可以在shell中做到这一点,虽然那很麻烦。

awk '/^2015-/ { datetime = $1 } / SQLHA / { print datetime }' testinput

使用sed

sed -n -e '/^2015-/ {s/ .*//; h; n; }' -e '/ SQLHA / { x; p; x; }' testinput

(如果在行的开头找到2015-,请删除空格后的内容并将其保存在保留空间中。如果发现SQLHA两边都有空格,请交换保留和模式空间(从而将保存的日期/时间放在模式空间中),然后打印它,然后将其切换回来。切换回意味着如果两行在日期行的出现之间包含SQLHA,那么你将获得相同的日期打印两次,而不是一个日期,然后是第一个SQLHA行。你最终不得不考虑什么可能出错,以及当一切正常时该怎么做 - 但这可能更晚于正确现在。)

仅使用sh

while read -r line
do
    case "$line" in
    (2015-*) datetime=$(set -- $line; echo $1);;  # Absence of quotes is deliberate
    (*SQLHA*) echo "$datetime";;
    esac
done < testinput

在shell中还有很多其他方法可以做到这一点。其中一些比这更安全。它将安全地处理显示的数据,但您可能会遇到恶意创建的数据。

while read -r line
do
    case "$line" in
    (2015-*) datetime=$(echo "$line" | sed 's/ .*//');;
    (*SQLHA*) echo "$datetime";;
    esac
done < testinput

每个日期行调用sed一次。使用Bash,我想你可以使用:

while read -r line
do
    case "$line" in
    (2015-*) datetime="${line/ */}";; # Replace blank and everything after with nothing
    (*SQLHA*) echo "$datetime";;
    esac
done < testinput

这是最不可能出错并避免为每一行执行外部命令。您还可以使用caseesac来避免if ... [[,以便获得模式匹配。等

在Mac上运行脚本,我收到错误输出,例如:

grep: 2015-07-18-00.07.28.991321-240: No such file or directory
grep: I84033A497: No such file or directory
grep: LEVEL:: No such file or directory

你没有看到吗?如果您不是,那么您已将错误发送到/dev/null(或终端以外的其他位置),或者您未向我们展示您正在使用的代码 - 或testinput文件顶部有一个空行。

答案 2 :(得分:0)

这是我写的(非常基本)。我会尝试与Grep运行相同的程序,并发布为什么我很快就会得到空白。

    while read -r  line
       do
      if [[ $line == *2015* ]];
       then
       dtime=`echo $line | cut -c1-26`
      fi
      if [[ $line == *SQLHA* ]];
       then
       echo $dtime
      fi
      done
     } < testinput 

使用的输入:

      2015-07-18-00.07.28.991321-240 I84033A497         LEVEL: Info
      EDUID   : 9510                 EDUNAME: db2agent (SIEB_RPT) 0
      FUNCTION: DB2 Common,APIs for DB2 HA Infrastructure, sqlhaAmIin 
      2015-07-18-00.07.29.991321-240 I84033A497         LEVEL: Info
      FUNCTION: DB2 Common, SQLHA APIs for DB2 HA Infrastructure, sqlha 
      2015-07-18-00.07.48.991321-240 I84033A497         LEVEL: Info
      EDUID   : 9510                 EDUNAME: db2agent (SIEB_RPT) 0
      FUNCTION: DB2 Common, SQLHA APIs for DB2 HA Infrastructure, sqlha 

O / p:

     2015-07-18-00.07.29.991321
     2015-07-18-00.07.48.991321