例如,我有一个日志文件有这个条目:
[Wed Aug 08 11:39:41 2012] [error] [client 155.94.70.224] ModSecurity:[file“/etc/httpd/modsecurity.d/rules/base_rules/modsecurity_crs_20_protocol_violations.conf”] [line“271”] [ “标签”RULE_MATURITY / 5“] [标签”RULE_ACCURACY / 5“] [标签”RULE_ACCURACY / 7“] [tag” https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960020 “] [tag”PROTOCOL_VIOLATION / INVALID_HREQ“] [tag” http://www.bad-behavior.ioerror.us/文件/如何工作/ “]警告。 string匹配REQUEST_PROTOCOL中的“HTTP / 1.1”。 [hostname“webmail.white-art.co.uk”] [uri“/horde/themes/graphics/tree/plusonly.png”] [unique_id“UCJB7VveCGYAAG @ BHJgAAAAQ”]
我想提取所有以字符开始的string对[并且结束于] 。 我可以使用剪切或awk提取使用单个分隔符,但我需要提取开始[和结束]之间的string。 如何完成?
例如,我需要提取:
“[标记”RULE_ACCURACY / 7“]”
和
“[严重性”通知“]”
从日志。
我find了一个解决scheme,首先我必须通过在每一行之后添加新行来爆炸日志] ,然后使用grep来search所需的string。 有没有更好的方法来做到这一点?
我认为这将分裂你想要的路线
sed -e 's/\]/\]\n/g' log | sed -e 's/^ *//g' | awk '/^\[/ {print}'
首先在每个之后放置一个换行符]然后删除任何前导空格,最后打印以[开头的行。
你的input行成为
[Wed Aug 08 11:39:41 2012] [error] [client 155.94.70.224] [line "271"] [id "960020"] [rev "2.2.5"] [msg "Pragma Header requires Cache-Control Header for HTTP/1.1 requests."] [severity "NOTICE"] [tag "RULE_MATURITY/5"] [tag "RULE_ACCURACY/7"] [tag "https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960020"] [tag "PROTOCOL_VIOLATION/INVALID_HREQ"] [tag "http://www.bad-behavior.ioerror.us/documentation/how-it-works/"] [uri "/horde/themes/graphics/tree/plusonly.png"] [unique_id "UCJB7VveCGYAAG@BHJgAAAAQ"]
这一个命令将做你想要的:
grep -o '\[[^]]*\]' inputfile