我需要在指定目录下通过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的,应该怎么做
shell cat 目录下所有的*.log grep使用
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
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 -E或egrep来进行更复杂的正则匹配,确保只匹配到完整的 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. 使用
grep和awk进行更精准过滤如果你需要更精细的控制,可以结合
grep和awk来筛选出包含完整 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 等,也可以进一步优化正则表达式。欢迎继续提问!
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报