【问题标题】:Cut Mod_Security ID with sed/awk使用 sed/awk 剪切 Mod_Security ID
【发布时间】:2016-11-25 02:30:31
【问题描述】:

我想减少 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

有人可以帮忙吗?提前谢谢你。

【问题讨论】:

    标签: bash awk sed grep mod-security2


    【解决方案1】:

    与sed:

    sed -n 's/.*\[id "\([^"]*\)"].*/\1/p'
    
    • 您需要在[id 之前和令牌之后消耗所有物品
    • 您需要转义方括号

    【讨论】:

    • 非常感谢 Jean,这个 sed 解决方案完美无缺。我已经为此苦苦挣扎了 2 周。谢谢。
    【解决方案2】:

    如果pcre 选项可用,则使用grep:

    $ grep -oP 'id "\K\d+' asd 
    000784
    9
    00263
    
    • id "\K 正向后向匹配 id ",不是输出的一部分
    • \d+id " 后面的数字


    与sed

    $ sed -nE 's/.*id "([0-9]+).*/\1/p' asd 
    000784
    9
    00263
    
    • .*id " 匹配到 id "
    • ([0-9]+) 捕获组以保存所需的数字
    • .* 余下一行
    • \1 整行仅替换为所需的字符串

    【讨论】:

    • 非常感谢 Sundeep,sed 和 grep 解决方案都运行良好。我已经为此苦苦挣扎了 2 周。也感谢您的快速回复和解释!!!
    • @AngelAsenov 很高兴它有帮助...如果您有兴趣,可以查看有关这些主题的文档以获取示例...例如:stackoverflow.com/documentation/awk/topics 和 stackoverflow.com/documentation/regex/topics
    • 所提供的主题似乎确实提供了非常有用的信息。非常感谢你的伙伴。
    【解决方案3】:

    当使用双引号作为自定义分隔符时,可以在第 6 个awk 字段中访问 ID:

    $ awk -F '"|"' '{print $6}' file
    000784
    9
    00263
    

    【讨论】:

    • 谢谢你,伙计,我不知道你可以使用 | 在所选分隔符之间打印一个字符串分隔符。这似乎非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2017-11-24
    • 2020-09-14
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多