PHP新手求助:解析exec中Linux命令各部分含义
解释PHP exec中的Unix命令片段
先给你拆解这条通过exec执行的命令链,再逐个解答你的疑问:
整条命令是把多个工具的输出依次传递,最终把符合条件的日志行存入PHP变量$logarr。
1. /usr/local/sbin/clog '/var/log/filter.log'
clog是FreeBSD系统(常见于pf防火墙环境)特有的工具,专门用来读取循环日志文件。这类日志会自动覆盖旧内容,用普通的cat或tail无法读取到完整的历史日志,clog能解析这种循环结构,把日志的全部内容输出出来。这条命令就是完整读取/var/log/filter.log这个防火墙日志文件的内容。
2. 管道符|的作用
管道符是Unix/Linux里的核心工具之一,它的作用是把前一个命令的标准输出,直接作为后一个命令的标准输入,实现多个命令的“链式处理”。比如这条命令里:
clog输出的日志内容,通过|传给第一个grepgrep过滤后的结果,再通过|传给tail- 以此类推,全程不用生成中间文件,直接在内存里传递数据。
3. /usr/bin/tail -r -n 350
tail是用来读取文件末尾内容的工具,这里的参数含义:
-n 350:指定只取输入内容的最后350行(也就是最新的350条日志)-r:把这350行的顺序反转,原本最后一行(最新日志)会变成第一行,最早的那行变成最后一行。
所以这个命令的效果是:拿到前面过滤后的日志,取最新350条,再按“最新到旧”的顺序输出。
补充:整条命令的完整流程
- 用
clog读取完整的防火墙循环日志 - 用
grep -F '10'过滤出包含字符串10的行(-F表示把10当作普通字符串,不是正则) - 取最新350条并倒序排列
- 用
grep -ve 'CLOG.*\033'去掉包含CLOG后跟转义字符(\033是终端转义符)的行(-v是反向匹配,-e指定匹配规则) - 最后只保留包含
filterlog:的行 - 最终结果存入PHP数组
$logarr,数组的每个元素对应一行日志
内容的提问来源于stack exchange,提问作者morteza mortezaie
相关产品推荐
相关产品推荐

