php 仿 linux cat 命令实现代码
2017-01-26 23:57
218 查看
<?php /** * Usage: * cat.php -n 10 -f test.log --line-numbers -r -h --help */ $longopts = array('line-numbers', 'help'); //显示行号 $opts = getopt('n:f:rh', $longopts); // n: 读取的行数, f: 读取的文件名 $lines = isset($opts['n']) ? intval($opts['n']) : 10; //默认读取 10 行内容 $fname = isset($opts['f']) ? $opts['f'] : ''; //处理的文件名 $show_line_numbers = isset($opts['line-numbers']) ? true : false; //默认不需要显示编号 $reverse = isset($opts['r']) ? true : false; //倒序显示文件内容 $show_help = ( isset($opts['h']) || isset($opts['help']) ) ? true : false; //显示帮助信息 if(PHP_SAPI != 'cli') { exit('Please run under the command line!'); } if($show_help) { show_help_info(); exit(); } /** * 显示帮助信息 */ function show_help_info() { $str = <<<'DATA' Usage: php cat.php -[n|f|r|h] --[line-numbers|help] Options: -n 读取的行数, 默认显示 10 行 -f 读取的文件名 -r 是否倒序显示文件内容, 默认为正序 --line-numbers 是否显示行编号, 默认不显示 --help,-h 显示帮助信息 DATA; echo ch_str_to_gbk($str); } /** * 根据系统类型转换字符串编码 */ function ch_str_to_gbk($str) { // 系统类型判断 if(stripos(PHP_OS, 'WINNT') !== false) { // win $str = iconv('UTF-8', 'GBK', $str); } return $str; } /** * @param $fh 文件句柄 * @param $lines 读取的行数 * @param $show_line_numbers 是否显示编号 */ function get_lines($fh, $lines, $show_line_numbers) { $data = array(); $start = 0; while(!feof($fh) && $start < $lines) { $ln = $show_line_numbers ? ($start+1) . ' ' : ''; //追加编号 $data[] = $ln . fgets($fh); $start++; } return implode($data); } /** * 倒序显示文件内容 * @param $fh 文件句柄 * @param $lines 读取的行数 * @param $show_line_numbers 是否显示编号 */ function get_lines_reverse($fh, $lines, $show_line_numbers) { $data = []; $pos = -1; $eof = false; //标记是否读完所有内容 while ($lines > 0) { $line = ''; $c = ''; while($c != "\n") { if(fseek($fh, $pos, SEEK_END) == 0) { $line = $c . $line; $c = fgetc($fh); $pos--; } else { $line = $c . $line; //拼接最后一个字符 $eof = true; break; } } $line .= "\n"; //添加换行符 array_unshift($data, $line); $lines--; if($eof) { //结束,退出循环 break; } } if($show_line_numbers) { //追加编号 $index = 1; foreach ($data as $k=>$d) { $data[$k] = $index . ' ' . $d; $index++; } } return implode($data); } if(!file_exists($fname)) { exit(sprintf('file [%s] not found!', $fname)); } $fh = fopen($fname, 'r'); if(!$fh) { exit(sprintf('open file [%s] error!', $fname)); } if($reverse) { $str = get_lines_reverse($fh, $lines, $show_line_numbers); } else { $str = get_lines($fh, $lines, $show_line_numbers); } $str = ch_str_to_gbk($str); echo $str; fclose($fh); //close
相关文章推荐
- 实现linux中的cat命令的功能
- Linux 下几个文件操作命令的代码实现
- linux下tree、命令的用法及实现代码
- cat命令的具体实现代码
- Linux下读取磁盘硬盘容量大小的C代码实现,不用df -h命令
- [zt] Linux 下几个文件操作命令的代码实现
- PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
- mycat命令——cat命令的自我代码实现
- Linux 下几个文件操作命令的代码实现
- mycat实现linux cat命令相似功能
- Linux 下几个文件操作命令的代码实现
- 在linux下代码实现ls -l 命令(利用移位 和 与 操作 对指定位的分离 )(指定位段的分离)
- Linux 下几个文件操作命令的代码实现
- 用C语言实现Linux命令的cat功能
- Linux编程实践——代码实现ac命令
- Linux 下几个文件操作命令的代码实现(转载)
- Linux下模拟ping命令的C代码实现2
- php守护进程,加linux命令nohup实现任务每秒执行一次
- linux下C实现cat命令
- Linux下模拟ping命令的C代码实现