{
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,我都会将时间写入输出文件。
答案 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
这是最不可能出错并避免为每一行执行外部命令。您还可以使用case
和esac
来避免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