Shell脚本:在日志的每一行中找出一个字符串并发送电子邮件

时间:2012-10-26 09:52:42

标签: linux shell aix

我有一个日志文件,其中包含如下所示的行。

10.10.205.100 100.10.56.5 - [23/Oct/2012:15:30:01 +0000] "GET /way/?cb=777:Obj.Status&log=signing_in_service&cache=1350334642666 HTTP/1.1" 200 53 "https://www.sample.com/signin?off=undefined&questions=&nouser=&link=%23&country=origin&displayLayer=" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2" "PD_STATEFUL_d64f218a-fa6a-11e0-b7df-623c1eeb9903=%2Fgateway; PD-ERR=0x132120c8; PD-HOST=sample.com; PD-REFERER=https://www.sample.com/profile%3Fundefined%3D; PD-REFPAGE=signin_user; pSite=; __SIGNIN=signin%23cw%3D400%3Ach%3D321; mmcore.pd=916254201%7CAgAAAAoBQvp/zPBKCBGRP6QBAOZMgV9Kf89IAAsAAAAtzSlGSn/PSAAAAAD/////AEoIAQAAAAAAAQAAAAAA////////////////AAAAAAABRQ%3D%3D; mmcore.srv=cg4.use; mmid=-1116944464%7CAgAAAAr6f8zwSggAAA%3D%3D; mmcore.tst=0.155; PD-SGNPAGE=http%3A%2F%2Fwww.sample.com%2Fcommon%2Fregister%2Feproxy.html; UnicaNIODID=A3nRYVRjMyy-Xv66UJt; survey=1350334587161"

我正在尝试获取上述行中的http状态代码200。这将放在字符串HTTP / 1.1“之后.http的版本(此处为1.1)在所有行中可能不常见。

根据状态代码(如果不是200和其他少数状态),我必须发送一封电子邮件和日志文件。

3 个答案:

答案 0 :(得分:2)

HTTP/之后的数字是http版本号。 http(http 1.0和http 1.1)的版本不多。所以这将工作:

 awk -F"HTTP/1.[0-9]\" " '{print $2}' filename | cut -d' ' -f 1

答案 1 :(得分:1)

您可以使用grep -o 'HTTP/[0-9.]\+" [0-9]\+'获取HTTP中的部分到该数字。空格之后是数字,所以只需添加| cut -f2 -d' '

答案 2 :(得分:1)

(我假设您只想邮寄违规行而不是整个日志文件。)

如果状态代码之前的空格数始终相同,则可以使用awk检查第九个字段。

#!/bin/bash
# find-bad-lines

# Match only statuses that do not start with 2 or 3
# (i.e., 4xx and 5xx)
awk '!match($9, /^[23]/)'

然后,您希望通过将find-bad-lines的输出汇总到handle-bad-lines

来处理每个“坏”行
#!/bin/bash
# handle-bad-lines

while read -r line
do
    # This is where you could execute a script for email
    echo "$line"
done

看起来像这样:

$ find-bad-lines <logfile.log | handle-bad-lines

显然你会想要添加错误处理和东西;但是,这是基本的想法。