showliuzp 2026-04-22 11:56 采纳率: 84.5%
浏览 1
已结题

shell cat 目录下所有的*.log grep使用

我需要在指定目录下通过cat *log查询包含的内容
目录:
/opt/data/cc.log
/opt/data/bb/aa.log
/opt/data/dd/bb.log

需要查找的内容如下
select user_id, user_message_box_id, dialog_id1, dialog_id2, dialog_message_id, sender_user_id, peer_type, peer_id, random_id, message_filter_type, message_data, message, mentioned, media_unread, , has_reaction,saved_peer_id, date2, ttl_period from messages_1 where user_id = 783272 and dialog_message_id = 2045953618577723392 and deleted = 0 limit 1

我现在通过cat *.log | grep "select user_id, user_message_box_id, dialog_id1, dialog_id2, dialog_message_id, sender_user_id, peer_type, peer_id, random_id, message_filter_type, message_data, message, mentioned, media_unread, , has_reaction,saved_peer_id, date2, ttl_period from" | grep dialog_message_id 

但这个查询是两个结果,也就是select user_id, user_message_box_id, dialog_id1, dialog_id2, dialog_message_id, sender_user_id, peer_type, peer_id, random_id, message_filter_type, message_data, message, mentioned, media_unread, , has_reaction,saved_peer_id, date2, ttl_period from和dialog_message_id 

我想在select user_id, user_message_box_id, dialog_id1, dialog_id2, dialog_message_id, sender_user_id, peer_type, peer_id, random_id, message_filter_type, message_data, message, mentioned, media_unread, , has_reaction,saved_peer_id, date2, ttl_period from的查询结果里再查出来包含dialog_message_id的,应该怎么做

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-04-22 11:57
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你目前的命令是:

    cat *.log | grep "select user_id, user_message_box_id, dialog_id1, dialog_id2, dialog_message_id, sender_user_id, peer_type, peer_id, random_id, message_filter_type, message_data, message, mentioned, media_unread, , has_reaction,saved_peer_id, date2, ttl_period from" | grep dialog_message_id
    

    但你发现它返回了两个结果,是因为 grep 会匹配包含该字符串的所有行。你希望的是 在包含完整 SELECT 语句的行中查找包含 dialog_message_id 的行


    ✅ 解决方案如下:

    1. 使用正则表达式进行精确匹配

    使用 grep -Eegrep 来进行更复杂的正则匹配,确保只匹配到完整的 SELECT 语句,并且其中包含 dialog_message_id

    修改后的命令:

    grep -E 'select[[:space:]]+user_id[[:space:]]+,.*dialog_message_id' /opt/data/*.log
    

    说明:

    • -E 表示使用扩展正则表达式。
    • select[[:space:]]+user_id 匹配以 select user_id 开头的行。
    • .*dialog_message_id 确保该行中包含 dialog_message_id
    • /opt/data/*.log 指定搜索路径下的所有 .log 文件。

    2. 使用 grepawk 进行更精准过滤

    如果你需要更精细的控制,可以结合 grepawk 来筛选出包含完整 SELECT 语句并且包含 dialog_message_id 的行。

    修改后的命令:

    grep -A 10 'select user_id, user_message_box_id, dialog_id1, dialog_id2, dialog_message_id, sender_user_id, peer_type, peer_id, random_id, message_filter_type, message_data, message, mentioned, media_unread, , has_reaction,saved_peer_id, date2, ttl_period from' /opt/data/*.log | awk '/dialog_message_id/'
    

    说明:

    • grep -A 10 表示匹配到匹配行后输出后续 10 行(根据你的日志格式调整)。
    • awk '/dialog_message_id/' 用于筛选包含 dialog_message_id 的行。

    3. 如果你想在多个目录中搜索(如 /opt/data/bb/aa.log/opt/data/dd/bb.log

    你可以使用通配符或 find 命令来遍历所有子目录中的 .log 文件:

    修改后的命令:

    grep -rE 'select[[:space:]]+user_id[[:space:]]+,.*dialog_message_id' /opt/data/
    

    说明:

    • -r 表示递归搜索。
    • 在整个 /opt/data/ 目录下查找符合正则表达式的行。

    ✅ 总结

    | 方法 | 优点 | 缺点 | |------|------|------| | grep -E | 简洁高效 | 需要写好正则表达式 | | grep + awk | 更灵活 | 复杂一点 | | grep -r | 支持多目录 | 可能速度稍慢 |


    ✅ 推荐最终命令(推荐使用)

    grep -rE 'select[[:space:]]+user_id[[:space:]]+,.*dialog_message_id' /opt/data/
    

    这个命令将递归地在 /opt/data/ 下的所有 .log 文件中查找包含完整 SELECT 语句并包含 dialog_message_id 的行。


    如有更多复杂需求,比如匹配特定日期、用户 ID 等,也可以进一步优化正则表达式。欢迎继续提问!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月30日
  • 已采纳回答 4月22日
  • 创建了问题 4月22日