bash 提取指定起始和结束字符的子字符串

bash 提取指定起始和结束字符的子字符串

例如,我有一个包含以下条目的日志文件:

[2012 年 8 月 8 日星期三 11:39:41] [错误] [客户端 155.94.70.224] ModSecurity:[文件“/etc/httpd/modsecurity.d/rules/base_rules/modsecurity_crs_20_protocol_violations.conf”] [行“271”] [id“960020”] [rev“2.2.5”] [msg“Pragma Header 需要 Cache-Control Header 用于 HTTP/1.1 请求。”] [严重性“NOTICE”] [标签“RULE_MATURITY/5”] [标签“RULE_ACCURACY/7”] [标签“https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960020“] [标签“PROTOCOL_VIOLATION/INVALID_HREQ”] [标签“http://www.bad-behavior.ioerror.us/documentation/how-it-works/“] 警告。REQUEST_PROTOCOL 上的字符串匹配“HTTP/1.1”。[主机名“webmail.white-art.co.uk”] [uri“/horde/themes/graphics/tree/plusonly.png”] [unique_id“UCJB7VveCGYAAG@BHJgAAAAQ”]

我想提取所有以 字符开头[并以 结尾的字符串]对。我可以使用 cut 或 awk 来使用单个分隔符进行提取,但我需要提取起始[和结束之间的字符串]。如何实现?

例如我需要提取:

“[标签“RULE_ACCURACY/7”]”

“[严重性“通知”]”

来自日志。


我找到了一个解决方案,首先我必须通过在每个后面添加新行来展开日志],然后使用 grep 搜索所需的字符串。有没有更好的方法?

答案1

我认为这将按照你想要的方式分割线

sed -e 's/\]/\]\n/g' log | sed -e 's/^ *//g' | awk '/^\[/ {print}'

首先在每个行后添加一个换行符,]然后删除所有前导空格,最后打印以 开头的行 [

您的输入行变成

[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"]

答案2

这一个命令就可以完成你想要的操作:

grep -o '\[[^]]*\]' inputfile

相关内容