用 sed/awk 剪切 Mod_Security ID
Cut Mod_Security ID with sed/awk
我想削减 Mod_sec ID 的配额之间的数字:[id "31231"]。通常一点也不难,但是当我尝试从多个报告中提取所有 ID 时,例如:
[Wed Oct 19 15:31:33.460342 2016] [:error] [pid 16526] [client 67.22.202.121] ModSecurity: Access denied with code 400 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/local/apache/conf/includes/mod_security2.conf"] [line "4968"] [id "000784"] [hostname "example.org"] [uri "/"] [unique_id "WAfYJU1ol@MAAECO@HQAAAAI"]
[Wed Mar 19 15:31:33.460342 2016] [:error] [pid 16526] [client 67.22.202.121] ModSecurity: Access denied with code 400 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/local/apache/conf/includes/mod_security2.conf"] [line "4968"] [id "9"] [hostname "example.org"] [uri "/"] [unique_id "WAfYJU1ol@MAAECO@HQAAAAI"]
[Wed Mar 19 15:31:33.460342 2016] [:error] [pid 16526] [client 67.22.202.121] ModSecurity: Access denied with code 400 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/local/apache/conf/includes/mod_security2.conf"] [line "4968"] [id "00263"] [hostname "example.org"] [uri "/"] [unique_id "WAfYJU1ol@MAAECO@HQAAAAI"]
我尝试了几个命令,例如:
cat asd | awk '/\[id\ "/,/"]/{print}'
cat asd | sed -n '/[id "/,/"]/p'
和许多其他人,但他们不打印所需的 ID,而是包括额外的输出,因为该模式已被多次匹配。通常我可以这样做:
cat asd | egrep -o "\"[0-9][0-9][0-9][0-9][0-9][0-9]\""
然后再次切掉输出但是在ID不包含6个数字的情况下这不起作用。
我不熟悉 awk、sed 和 egrep 的所有选项,似乎没有找到解决方案。
我想从上面的历史打印出来的是:
000784
9
00263
有人可以帮忙吗。提前谢谢你。
使用 grep
如果 pcre
选项可用:
$ grep -oP 'id "\K\d+' asd
000784
9
00263
id "\K
正后视匹配 id "
,不是输出的一部分
\d+
id "
后面的数字
随着 sed
$ sed -nE 's/.*id "([0-9]+).*//p' asd
000784
9
00263
.*id "
匹配到 id "
([0-9]+)
捕获组以保存所需的数字
.*
其余行
整行仅替换为所需的字符串
与sed
:
sed -n 's/.*\[id "\([^"]*\)"].*//p'
- 您需要消耗掉您的令牌
[id
之前和之后的所有物品
- 你需要转义方括号
当双引号用作自定义分隔符时,可以在第 6 个 awk
字段中访问 ID:
$ awk -F '"|"' '{print }' file
000784
9
00263
我想削减 Mod_sec ID 的配额之间的数字:[id "31231"]。通常一点也不难,但是当我尝试从多个报告中提取所有 ID 时,例如:
[Wed Oct 19 15:31:33.460342 2016] [:error] [pid 16526] [client 67.22.202.121] ModSecurity: Access denied with code 400 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/local/apache/conf/includes/mod_security2.conf"] [line "4968"] [id "000784"] [hostname "example.org"] [uri "/"] [unique_id "WAfYJU1ol@MAAECO@HQAAAAI"]
[Wed Mar 19 15:31:33.460342 2016] [:error] [pid 16526] [client 67.22.202.121] ModSecurity: Access denied with code 400 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/local/apache/conf/includes/mod_security2.conf"] [line "4968"] [id "9"] [hostname "example.org"] [uri "/"] [unique_id "WAfYJU1ol@MAAECO@HQAAAAI"]
[Wed Mar 19 15:31:33.460342 2016] [:error] [pid 16526] [client 67.22.202.121] ModSecurity: Access denied with code 400 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/local/apache/conf/includes/mod_security2.conf"] [line "4968"] [id "00263"] [hostname "example.org"] [uri "/"] [unique_id "WAfYJU1ol@MAAECO@HQAAAAI"]
我尝试了几个命令,例如:
cat asd | awk '/\[id\ "/,/"]/{print}'
cat asd | sed -n '/[id "/,/"]/p'
和许多其他人,但他们不打印所需的 ID,而是包括额外的输出,因为该模式已被多次匹配。通常我可以这样做:
cat asd | egrep -o "\"[0-9][0-9][0-9][0-9][0-9][0-9]\""
然后再次切掉输出但是在ID不包含6个数字的情况下这不起作用。
我不熟悉 awk、sed 和 egrep 的所有选项,似乎没有找到解决方案。
我想从上面的历史打印出来的是:
000784
9
00263
有人可以帮忙吗。提前谢谢你。
使用 grep
如果 pcre
选项可用:
$ grep -oP 'id "\K\d+' asd
000784
9
00263
id "\K
正后视匹配id "
,不是输出的一部分\d+
id "
后面的数字
随着 sed
$ sed -nE 's/.*id "([0-9]+).*//p' asd
000784
9
00263
.*id "
匹配到id "
([0-9]+)
捕获组以保存所需的数字.*
其余行整行仅替换为所需的字符串
与sed
:
sed -n 's/.*\[id "\([^"]*\)"].*//p'
- 您需要消耗掉您的令牌
[id
之前和之后的所有物品 - 你需要转义方括号
当双引号用作自定义分隔符时,可以在第 6 个 awk
字段中访问 ID:
$ awk -F '"|"' '{print }' file
000784
9
00263